2010-01-12 6 views
13

저는 라이브러리를 사용하는 사람들의 디버깅을 향상시키기 위해 예외를 throw하도록 기존 라이브러리를 업데이트했습니다.Java, 클래스 별 예외 vs. 표준 예외

처음에는 각 클래스에 특정한 예외를 정의 할 것이라고 생각했지만 대부분의 예외는 특정 메시지가있는 기존 런타임 예외 (예 : FooNegativeIntArgumentException extends IllegalArgumentException, FooNullBarException extends NullPointerException)를 단순히 확장 한 것으로 나타났습니다.

새로운 예외를 정의 할 때와 기존의 예외를 사용할 때의 절충점은 무엇입니까? 컨벤션/모범 사례가 있습니까?

또한 이전 버전과의 호환성이 필요하므로 대부분의 예외는 런타임 예외입니다.

+0

일반적으로 사용자 지정 예외를 사용하지 않는 이유와 실제 유용하게 사용하는 경우에 대한 자세한 정보를 제공해 주신 데 감사드립니다. – Carl

답변

15

여기에 my take on why we have different types of exception and when to create custom exception types (참고 : .NET 유형을 예로 사용하지만 Java와 구조화 된 오류 처리를 사용하는 다른 언어에도 동일한 원칙이 적용됩니다.)여기에 완전한 답으로 게시하는 것은 너무 길기 때문에 두 개의 주요 추출물을 게시 할 것입니다.

  1. 이 때 서로 다른 유형의 예외를 던져? 프로그래밍 방식으로 다르게 처리 할 수있는 각 증상에 대해 다른 유형의 예외를 발생시킵니다.

  2. 언제 사용자 정의 예외 유형을 만드시겠습니까? 증상에 대한 프로그래밍 방식 처리를 돕기 위해 예외에 주석을 추가해야하는 경우 사용자 지정 예외 형식을 만듭니다. 그것은 사용자 정의 예외 타입 같은 소리하지 않는 경우

표준 예외를 사용하여 전달 될 수있는 증상의 차이를 채우고, 그들은 프로그램 처리를위한 추가 정보를 추가하지 않는 그래서 그들을 만들지 마라. 대신에 표준을 사용하십시오.

7

이와 같은 값을 추가하지 않고 예외를 확장하는 것은 완전한 시간 낭비이며, 피하는 것이 가장 좋습니다.

표준 예외를 사용하십시오.

당신이 제시 한 유스 케이스가 아닌, 사용자 정의 예외를 절대로 사용해서는 안된다는 말은 아닙니다.

또한 사용자 지정 예외를 만들 때 발생시킬 수있는 클래스가 아닌 해당 예외를 발생시키는 조건과 관련되어야합니다. 예외를 유발하는 오류 조건이 이러한 방식으로 관련되어있을 수 있으므로 비즈니스/기능 영역과 관련시키는 것이 좋으며 유용한 필터링 기술을 제공합니다.

+0

언제나처럼 ... 누군가 내 대답에 이겼다. :-) – cjstehno

+0

기본 예외에서 확장하는 한 클라이언트 측 비용이 발생하지 않습니다. 사용자 정의 예외는 대부분의 경우 더미 예외를 throw하는 것보다 더 명시적인 오류 처리를 허용 할 수 있습니다. –

+0

@Stefan - 주어진 예제는 가치가 없습니다. null 포인터 또는 잘못된 매개 변수에 대한 사용자 지정 예외가 어떤 값을 추가하는지, 그리고 물론 유지 관리 비용이 있는지를 확인하지 못합니다. 모든 새로운 매개 변수 유형 또는 경계는 이제 새로운 예외를 필요로하지만, 상기 유형을 제거하면 쓸모없는 코드 인공물이 남을 것입니다. – Robin

1

절충? 많은 일, 많은 코드를 유지하고 시간은 돈입니다. 나는 제안 할 것이다 : 당신이 로그, 세분화 된 예외 처리 또는 디버깅 (특별한 예외 유형을위한 중단 점 설정)을 필터링하기 위해 필요하다면 새로운 예외를 정의하라.

1

명시 적으로 정의 된 예외를 사용하여 클라이언트 코드를보다 잘 제어 할 수 있습니다. 클라이언트가 원하는 경우 위의 예 에서처럼 IllegalArgumentException을 잡을 수 있습니다. 더 많은 통제가 필요하면 개별 유형의 예외를 잡을 수 있습니다. 예를 들어, IllegalArgumentException의 2 개의 서브 클래스를 슬로우 할 수있는 메소드를 생각해 봅시다. 하위 클래스를 만들지 않으면 throw 된 예외의 실제 원인을 확인하기 위해 문자열 구문 분석이나 다른 말도 안되는 것을 수행해야합니다. 사용자 정의 유형은이 문제를 해결합니다.

+0

이 접근법에 대한 배급 혜택 비용은 비용면에서 부담 스럽다고 나는 말할 것이다. – Robin

2

호출자가 IllegalArgumentException 대신 FooNegativeIntArgumentException을 catch해야 할 가능성이 있습니까?

내 생각에 거의 발생하지 않을 것입니다. 따라서 이러한 차별화가 필요한 상황이 나타날 때까지 기본적인 예외 사항을 고수 할 것입니다.

6

Effective Java

에서 당신은 표준 예외의 사용을 선호하고 설명 무엇 포함되지 않은 예외의 설정 Java 플랫폼 라이브러리를 사용합니다. 예외를 인용하면 다음과 같은 이점이 있습니다

학습하고 프로그래머가 이미

적은 예외 클래스는 작은 메모리 풋 프린트와 적은 시간 동안 로딩 클래스를 의미 친숙한 설립 규칙을 일치하기 때문에 사용하는 API가 쉬워집니다.

+0

링크가 더 이상 작동하지 않습니다. http://www.oracle.com/technetwork/java/effective-exceptions-092345.html 책 구매 방법에 대한 정보 또는 링크입니까? – Raystorm