2011-03-15 6 views
21

저는 현재 C#을 배우고 있습니다.하지만 뭔가에 갇혀 있고 해결책을 찾을 수 없습니다.
내 자신의 Exception 클래스를 만들려고합니다.사용자 지정 C# 예외를 만드는 방법은 무엇입니까?

예외가 "InvalidNumberException"이라면 숫자가 5인지 확인합니다. 나는 어리석은 것처럼 보일 수 있지만 단지 사용자 정의 예외 생성에 대한 아이디어가 필요하다는 것을 알고 있습니다.

public class InvalidNumberException : System.Exception 
{ 
    public InvalidNumbertException() : base() { } 
    public InvalidNumberException(string message) : base(message) { } 
    public InvalidNumberException(string message, System.Exception inner) : base(message, inner) { } 

    // A constructor is needed for serialization when an 
    // exception propagates from a remoting server to the client. 
    protected InvalidNumberException(System.Runtime.Serialization.SerializationInfo info, 
     System.Runtime.Serialization.StreamingContext context) { } 
} 

하지만 숫자가에서 입력이 클래스의 메소드 또는 생성자를 구현하는 방법을 모른다 :

지금까지 나는 예외를 만드는 나는이 네 가지 생성자가 필요하다고 MSDN에서 발견 console은 5와 같고, 그렇지 않으면 예외를 던집니다.

누군가 나를 도와 주시면 감사하겠습니다.

+0

OT를 사용하면 네 개의 생성자를 직접 작성하지 않아도됩니다. 필요한 것을 구현하십시오. 'public class InvalidNumberException : 당신이해야 할 일이'new new InvalidNumberException();'이 될 경우 Exception {}이 작동해야합니다. –

+2

정말 필요하지 않는 한 커스텀 예외를 생성하면 안된다는 점은 주목할 가치가 있습니다. 아주 신중하게 먼저 생각하십시오. http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx –

답변

22

: 같은

그래서 당신의 코드를 볼 수 있었다. 작성중인 예외에 대해 생각하십시오. int!=에서 5이되도록하십시오.

그래서, 나는이 같은 하나의 생성자 것 :

public InvalidNumberException(int value) 
    : base(String.Format("Some custom error message. Value: {0}", value)) { } 

을 그리고 다음과 같이 사용 : 당신이 포장되어서는 안

if (number == 5) 
    throw new InvalidNumberException(number); 

try 블록이다. 그것은 예를 들어, 예외를보기 위해 위의 코드 블록을 실행하는 코드의 일이다 :

try 
{ 
    CallSomeMethodWhichChecksTheNumberAndThrowsIfNecessary(); 
} 
catch (InvalidNumberException inex) 
{ 
    // do something, print to console, log, etc 
} 

내가 이것을 바라고 있어요 단지 이러한 목적을 위해 Int32.ParseInt32.TryParse 방법이 있기 때문에 기대어에 대한 - 사용자 정의 예외 수업은 필요하지 않습니다.

27

예외 자체가 검사를해서는 안됩니다. 대신, 숫자와 함께 작동하는 코드가 있으면이 코드를 사용해야합니다. 어떤 주어진 상황에서 프로그램이 정상적으로 실행되지 않을 수 있으며, 중단해야한다고 말한다 암시 예외를 발생함으로써

if (number == 5) 
    throw new InvalidNumberException(); 
+0

을 참조하십시오. 예외 번호를 전달할 수도 있습니다. 의미있는 메시지를 표시하십시오. –

+0

그는 예외 내의 번호를 확인하는 것에 대해 이야기하고 있습니다. 표시되는 메시지는 서로 관련이 없습니다. –

4

: 이런 식으로 뭔가를 시도하십시오. 당신이 때로는 더 구체적인 예외를 사용하는 것이 좋습니다 등 InvalidOperationException이, NullReferenceException이 같은보다 구체적인 예외를 사용할 수

if (conditionMet) 
    throw new Exception(); 

더 구체적으로 그것은 당신이 당신의 자신의 예외 형식을 만들 때이다 : 당신은 너무처럼 할 System.Exception 기본 파생에서 파생됩니다. 프로그램에 있던 조건에 대한 컨테이너로 만드는 사용자 지정 예외를 생각해보십시오. 귀하의 경우에 조건은 유효하지 않은 숫자가 전달 되었기 때문에 위의 일반 예외 대신 사용하는 InvalidNumberException 컨테이너를 생성합니다.

CLR이 "throw new"문을 실행할 때마다 현재 코드 경로의 실행을 중단하고 해당 예외를 처리 할 수있는 catch 문을 찾습니다. 당신은 모든 생성자가 필요하지 않습니다

try 
{ 
    if (number == 5) 
     throw new InvalidNumberException(); 
} 
catch (InvalidNumberException e) 
{ 
    System.Console.WriteLine("Hey I got an InvalidNumberException"); 
} 
8

답변이 잘못되었습니다.

public InvalidNumberException(int value) 
{ 
    var message = string.Format("Some custom error message. Value: {0}", value); 
    base(message, this.InnerException) 
} 

이 그것을 할 수있는 더 좋은 방법입니다 : 허용 대답에서

public InvalidNumberException(int value) : base(string.Format("Some custom error message. Value: {0}", value)) { } 
+0

수락 된 대답이 왜 잘못 되었는가를 설명 할 수 있습니까? – numaroth

+2

허용 된 답변이이 코드를 사용하도록 편집되었습니다. –

0

그것은 반드시 사실이 아니다 모든 던져 예외 중단으로 이어질 것입니다 오류가 있음을 당신의 애플 리케이션 - 그들은 percolating없이 잡힐만큼, 즉이다;).

잘못된 번호 입력의 경우 예외가 발생한 다음 사용자에게 잘못된 번호를 입력했음을 알리고 유효한 번호에 대한 규칙을 기록한 다음 번호를 다시 입력하도록 요청할 수 있습니다. 사용자가 데이터베이스 계정에 대해 맞춤법이 틀린 암호 또는 연결 문자열을 입력하고 SqlException을 잡았거나 백 가지의 수정 가능한 실수가있는 경우에도 마찬가지입니다.

관련 문제