2012-01-16 1 views
0

같은 유형의 예외를 발생시키는이 클래스가 있는데이 예외를 캡처하고 적절한 오류 메시지를 표시하는 방법은 무엇입니까? 여기 내가 지금하는 일이 있습니다.예외 - 메서드가 두 개 이상 올릴 때 예외 구분

public bool ChangePassword(oldPassword,newPassword) 
{ 

    if(oldPassword != savedInDatabase) 
{ 
    throw new ArgumentException("Your old password is not same as one saved in our database") 
} 

    if(string.IsNullOrEmpty(oldPassword) || string.IsNullOrEmpty(newPassword)) 
{ 
throw new ArgumentException("Your old or new password is empty of null"); 
} 

} 

그리고 당신이 다른 예외 유형을 던지는 고려해 볼 수 있습니다

try 
{ 
} 
catch(ArgumentException ex) 
{ 
if(ex.Message.contains("Your old or")) 
{ 
    messagebox.show("Either your old or new password is empty or null") 
} 
... 
} 
+2

왜 돈 : 당신이 정말로 사용자 정의 예외의 길을 가고 싶은 경우

그러나, 그 다음 또 다른 옵션은 같은 모든 다른 옵션과 enum 소요 하나의 사용자 정의 예외를 만드는 것입니다 원래 예외의 메시지 만 표시합니까? 그런 문자열을 찾는 것은 대개 나쁜 생각입니다. –

+0

@Oded 잘 할 수는 있지만, 그렇다면 어떻게 ArgumentNullException 형의 다른 예외를 식별 할 수 있습니까? 나는 더 나은 아이디어가 예외를위한 친숙한 메시지를 사용하고 그들을 표시하는 것입니다. – Deeptechtons

+0

@PeetBrits 왜 지금 당장 생각하고 있는지 원래의 예외 메시지를 표시하지 않는 이유는 무엇입니까? 그냥 문자열을 확인하는 것보다는 친숙한 메시지를 사용하십시오. – Deeptechtons

답변

2

귀하의 예제는 실제로 사용자 지정 예외를 정당화하지 않습니다. 나는 단지 원래 메시지를 표시한다고 말한다.

public class PasswordException : Exception 
{ 
    public PasswordException(PasswordResult result) : base() { } 
    public PasswordException(PasswordResult result, string message) : base(message) { } 
    public PasswordException(PasswordResult result, string message, Exception innerException) : base(message, innerException) { } 
} 

public enum PasswordResult 
{ 
    Success = 0, 
    PasswordMismatch, 
    PasswordEmpty, 
    // and so forth 
} 
+1

또는 해당 열거 형을 반환하는 메서드가 있습니다. –

+0

@Hans, 네, 심지어 버터입니다.하지만 상황에 따라 다릅니다 (예 : 반환 값을 무시할 수있는 서비스를 사용하고 있습니까?). –

2

아래 않습니다. 이전 또는 새 암호가 null이거나 비어있는 경우 라이브러리 예외 유형을 고수하려면 ArgumentNullException이 적합합니다. 또는 당신이 (WCF에서 FaultExceptions에 아마 유사)보다 구체적인 오류와 함께 자신의 예외 유형을 정의 또는 사용자 정의 예외의 자원 식별자를 포함하여 고려할 수있다 (호환 I18N을 보장하기 위해) :

public class ResourceableException : Exception 
{ 
    public string ResourceKey { get;set; } 
} 

을 다음과 같이 사용 :

try { ... } 
catch (ResourceableException e) 
{ 
    messagebox.Show(ResourceManager.GetResource(e.ResourceKey)); 
} 
+0

인수 예외 같은 것들에 대해 약간 죽이지는 않습니까? –

1

이 같은 사용자 정의 예외를 만들 수 있습니다

public class PasswordEmptyOrNullException : Exception 
{ 
    public PasswordEmptyOrNullException(string message) 
     : base(message) 
    { 

    } 
} 

public class OldPasswordNotFoundException : Exception 
{ 
    public OldPasswordNotFoundException(string message) 
     : base(message) 
    { 

    } 
} 

그들은 다음과 같이 사용할 수 있습니다

,
throw new PasswordEmptyOrNullException("A message"); 

그럼 당신은 이런 시도 캐치 문을 처리 할 수 ​​

try 
{ 
} 
catch (PasswordEmptyOrNullException ex) 
{ 
    // Do stuff 
} 
catch (OldPasswordNotFoundException ex) 
{ 
    // Do stuff 
} 

그래서 당신은 다른 방법으로 예외의 다른 유형을 처리 할 수 ​​있습니다. 그것이 당신이 찾고 있었던 것이기를 바랍니다.