IT story

C #에서 내 자신의 예외를 어떻게 정의합니까?

hot-time 2021. 1. 6. 20:23
반응형

C #에서 내 자신의 예외를 어떻게 정의합니까?


C #에서 내 자신의 예외를 어떻게 정의합니까?


고유 한 예외를 만들기위한 지침 (클래스가 예외에서 상속해야한다는 사실 옆)

  • [Serializable]속성 을 추가하여 클래스가 직렬화 가능한지 확인하십시오.
  • 예외에서 사용되는 공통 생성자를 제공하십시오.

    MyException ();
    
    MyException (string message);
    
    MyException (string message, Exception innerException);
    

따라서 이상적으로는 사용자 정의 Exception가 다음과 같이 표시되어야합니다.

[Serializable]
public class MyException : Exception
{
    public MyException ()
    {}

    public MyException (string message) 
        : base(message)
    {}

    public MyException (string message, Exception innerException)
        : base (message, innerException)
    {}    
}

당신이 상속할지 여부를 사실 정보 ExceptionApplicationException:합니다 FxCop은 상속되지 않도록해야한다고 말했습니다 규칙이 있습니다 ApplicationException:

CA1058 : Microsoft.Design :
더 이상 'ApplicationException'을 확장하지 않도록 'MyException'의 기본 유형을 변경하십시오. 이 기본 예외 유형은 프레임 워크 클래스에 대한 추가 값을 제공하지 않습니다. 대신 'System.Exception'또는 기존 봉인되지 않은 예외 유형을 확장하십시오. 전체 예외 클래스에 대한 catch 핸들러 생성을 활성화하는 데 특정 값이 없으면 새 예외 기본 유형을 생성하지 마십시오.

이 규칙에 대해서는 MSDN 페이지를 참조하십시오 .



제가 약간의 예외적 인 은밀한 전투를 시작한 것 같습니다. 따르는 Microsoft 모범 사례 가이드에 따라 System.Exception 또는 System.ApplicationException에서 상속 할 수 있습니다. 혼란을 해소하려는 좋은 (그러나 오래된) 블로그 게시물이 있습니다. 지금은 Exception을 사용하여 예제를 유지하지만 게시물을 읽고 필요한 사항에 따라 선택할 수 있습니다.

http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx

더 이상 전투가 없습니다! 예외가 System.ApplicationException이 아닌 System.Exception에서 상속되어야 함을 나타내는 FxCop 규칙 CA1058을 지적한 Frederik에게 감사드립니다.

CA1058 : 유형은 특정 기본 유형을 확장해서는 안됩니다.


Exception에서 상속하는 새 클래스를 정의합니다 (일부 생성자를 포함했지만 필요하지 않음).

using System;
using System.Runtime.Serialization;

[Serializable]
public class MyException : Exception
{
    // Constructors
    public MyException(string message) 
        : base(message) 
    { }

    // Ensure Exception is Serializable
    protected MyException(SerializationInfo info, StreamingContext ctxt) 
        : base(info, ctxt)
    { }
}

그리고 던질 코드의 다른 곳 :

throw new MyException("My message here!");

편집하다

Serializable 예외를 보장하기 위해 변경 사항으로 업데이트되었습니다. 자세한 내용은 여기에서 찾을 수 있습니다.

Winterdom 블로그 아카이브-예외 클래스를 직렬화 가능하게 만들기

Exception 클래스에 사용자 지정 속성을 추가하는 경우 수행해야하는 단계에 대한 섹션을주의 깊게 살펴보십시오.

전화 해주신 Igor에게 감사드립니다!


정의하려면 :

public class SomeException : Exception
{
    // Add your own constructors and properties here.
}

던지려면 :

throw new SomeException();

정의:

public class CustomException : Exception
{
   public CustomException(string Message) : base (Message)
   {
   }
}

던지기 :

throw new CustomException("Custom exception message");

고유 한 예외를 정의 할 수 있습니다.

사용자 정의 예외 클래스는 ApplicationException 클래스 에서 파생됩니다 .

다음 코드를 볼 수 있습니다.

using System;
namespace UserDefinedException
{
   class TestTemperature
   {
      static void Main(string[] args)
      {
         Temperature temp = new Temperature();
         try
         {
            temp.showTemp();
         }
         catch(TempIsZeroException e)
         {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: ApplicationException
{
   public TempIsZeroException(string message): base(message)
   {
   }
}
public class Temperature
{
   int temperature = 0;
   public void showTemp()
   {
      if(temperature == 0)
      {
         throw (new TempIsZeroException("Zero Temperature found"));
      }
      else
      {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}

예외를 던지는 경우

System.Exception 클래스 에서 직접 또는 간접적으로 파생 된 경우 개체를 throw 할 수 있습니다.

Catch(Exception e)
{
   ...
   Throw e
}

참조 URL : https://stackoverflow.com/questions/2200241/in-c-sharp-how-do-i-define-my-own-exceptions

반응형