2011-01-17 2 views
3

가능한 중복 사용 :
Create custom exception or use built-in exceptions?때 사용자 정의 예외

안녕,

프로그램 디자인을, 그것은 비즈니스 제약에 대한 예외를 모델링하는 정상입니까? 예 : abc (바구니 객체가 객체를 추가 할 수 있기 전에 존재해야 함)를 얻으려면 xyz가 1보다 커야하고 바구니가 존재하지 않는 경우이 실제 시나리오를 모델링하기위한 맞춤 예외가있는 충분한 이유입니다 ?

사용자 지정 예외를 사용하는 이유는 무엇입니까?

답변

1

바스켓이없는 경우 변수가 매개 변수인지 여부에 따라 ArgumentNullException 또는 InvalidOperationException과 같은 소리가납니다. xyz이 1보다 커야 만하는 경우, ArgumentException처럼 들립니다. 후자의 경우도 을 처리 할 수있는 것처럼 들리지만 유효성 검사가 수행되는 위치에 따라 예외가 적용됩니다 ().

표준 라이브러리의 일부로 이미 정의 된 많은 예외가 있습니다. 내 충고는 그러한 예외가 귀하의 특정 시나리오를 실제로 다루지 않는다는 것을 분명하게 입증 할 수있을 때까지 이들에게 의존하는 것입니다.

+2

NullReferenceException을 던지지 않아야합니다. 그것은 꽤 구체적입니다. null이 참조 해제 될 때 던져 질 것입니다. 다른 용도로는 ArgumentNullException 또는 InvalidOperationException이 더 적절합니다. –

0

내가 다르게 치료할 계획이라면 맞춤 예외를 사용합니다 (또는 다르게 취급해야한다고 생각합니다). 많은 경우, 좋은 메시지를 가진 일반적인 예외는 충분합니다.

캐치에서 수행하려는 작업이 메시지를 표시하는 경우 사용자 지정 예외를 많이 벗어나지 않습니다.

+0

자동차가 의도 된 작업을 수행하는 방법을 시작할 때 좋은 예가 cardoesntstartexception입니다. 또한 실제로 예외를 잡아 내거나/또는 가장자리 케이스를 처리하는 것이 합리적일까요? (예 : 시스템 사용자의 데이터베이스를 편집하는 기술 사용자 또는 기술자가 아닌 사용자). – dotnetdev

+0

다른 예외와 다르게 처리하는 경우에만 중요합니다. 그 너머에 오류 메시지가 다릅니다. 그것이 시작되지 않으면 당신은 그들을 위해 차를 시동합니까? 아니면 그냥 말해 주겠니? 물론 엣지 케이스는 처리해야합니다. –

0

대부분의 경우 이미 예외가있는 것이 좋습니다. @Anthony가 말하는 것처럼 ArgumentException. 원하는 경우 언제든지 예외 내에 메시지를 남길 수 있습니다.

경우에 따라 맞춤 예외가있는 것이 편리합니다.

catch(ArgumentException e) 
{ 
    if(e.Message.Equals("The argument was bigger than 0")) 
     // do something 
    else 
     // do something else 
} 

지저분한 코드를 초래하고 어쩌면 사용자 정의 이벤트 또는 래퍼 예외가 더 적합 할 것입니다 : 예를 들어, 당신은 같은 코드가있을 때.

어쩌면 당신은뿐만 아니라이 블로그를 확인할 수 있습니다 : 당신은 기존의 예외의 기능을 복제 예외를 만들려고하는 것처럼 http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx

0

그것은 소리. 예를 들어 빈 바구니 시나리오를 처리 할 수 ​​있습니다. throw new ArgumentException("Basket not instantiated");

의심스러운 경우 MSDN의 Exception Design Guidelines으로 되돌아갑니다.

1

내가 생각하는 질문은 사용자 정의 예외 클래스를 작성해야하는지 아닌지, 잘못된 입력의 정상적인 조건에 대해 예외를 사용해야하는지 여부, 즉 사용자가 새 비밀번호를 작성하도록 요청한 경우 코드가 내부적으로 PasswordTooWeakException (또는 InvalidArgumentException) 암호가 너무 약하거나 다른 방법으로 처리해야합니다. 이것이 질문 인 경우, 내 대답은 아니오입니다.이 경우 예외를 사용해서는 안됩니다. 예외는 예외적 인 경우에만 경우에만 해당됩니다. 즉오류 상황, 예상치 못한 상황이 발생합니다.

관련 문제