예외 처리에 대한 몇 가지 규칙이 있습니다. 그러나 먼저 예외는 코드에 의해 노출되는 인터페이스의 일부 라는 것을 기억해야 합니다. 문서화하십시오 . 인터페이스가 공개 인터페이스 일 때 특히 중요하지만 개인 인터페이스에서도 매우 좋습니다.
예외는 코드가 적절한 작업을 수행 할 수있는 지점에서만 처리해야합니다. 최악의 처리 옵션은 그들에 대해 전혀 아무것도하지 않는 것입니다. 정확히 올바른 옵션 일 때만 수행해야합니다. (내 코드에서 그러한 상황이 발생하면 그 효과에 대한 주석을 포함하여 빈 몸에 대해 걱정하지 않아도됩니다.)
두 번째로 최악의 옵션은 원본을 원인으로 첨부하지 않고 관련이없는 예외를 발생시키는 것입니다. 여기서 문제는 문제의 진단을 허용하는 원래 예외 내의 정보가 손실된다는 것입니다. 당신이 아무도와 아무것도 할 수 없다는 것을 만드는 (다른 우리가 증오하는 방법 "그렇지 않은 일", 그리고 우리 모두가 알고 불평보다 그 버그 리포트를).
예외를 기록하는 것이 훨씬 좋습니다. 이를 통해 누군가가 문제점을 찾아서 해결할 수 있지만 외부 연결을 통해 문제점이 유실되거나보고 될 때만 예외를 기록해야합니다. 로깅이 더 자주 중요한 문제가 아니기 때문에 과도한 로깅은 더 많은 정보를 포함하지 않고 더 많은 공간을 소비하는 로그를 의미하기 때문입니다. 예외를 기록한 후에 는 짧은 버전을 일치시킬 수 있도록 보고서에 생성 시간 또는 기타 상관 관계 식별자가 포함되어있는 한 양심을 가지고 사용자 / 클라이언트 에게 précis 를보고 할 수 있습니다. 필요한 경우 세부 사항을 확인하십시오).
물론 최선의 선택은 예외 상황을 완전히 처리하고 오류 상황을 전체적으로 처리하는 것입니다. 이 작업을 수행 할 수 있으면 반드시 수행하십시오! 예외를 기록하지 않아도된다는 의미 일 수도 있습니다.
예외를 처리하는 한 가지 방법은 문제에 대한 높은 수준의 설명을 제공하는 다른 예외를 발생시키는 것입니다 (예 : " failed to initialize
"대신 " index out of bounds
"). 예외의 원인에 대한 정보를 잃지 않는 한 좋은 패턴입니다. cause
상위 예외를 초기화 하거나 위에서 설명한대로 세부 사항을 기록하려면 세부 예외를 사용하십시오 . 로깅은 IPC 호출과 같은 프로세스 간 경계를 넘을 때 가장 적합합니다. 연결의 다른 쪽 끝에는 하위 수준 예외 클래스가 전혀 존재하지 않을 것입니다. 내부 경계를 넘을 때는 첨부 된 원인으로 유지하는 것이 가장 적합합니다.
또 다른 패턴은 catch-and-release입니다.
try {
// ...
} catch (FooException e) {
throw e;
}
이것은 다른 절 에서 유형 제한을 얻지 않는 한 안티 패턴 catch
입니다. 즉, 예외를 그냥 내버려 둘 수는 없습니다. 그런 다음 Java의 추악한 기능입니다.
확인 된 예외와 확인되지 않은 예외는 메소드 경계를 넘는 확인 된 예외를 선언 해야 한다는 점 외에는 실제로 차이가 없습니다 . 확인되지 않은 예외를 @throws
javadoc 주석 과 함께 문서화 하여 의도적으로 코드에 의해 처리되는 것을 알고 있으면 여전히 좋은 아이디어 입니다. java.lang.Error
JVM 구현을 작성 하지 않는 한 의도적으로 또는 그 서브 클래스를 던지지 마십시오 .
의견 : 예기치 않은 오류 사례는 항상 코드의 버그를 나타냅니다. 확인 된 예외는 이러한 위협을 관리하는 방법이며 개발자가 오류 사례를 처리하는 데 어려움을 피하기 위해 의도적으로 확인되지 않은 예외를 사용하는 경우 시간을 정리해야하는 많은 기술적 부채가 발생합니다. 강력한 코드를 원한다면 조잡한 오류 처리는 전문적이지 않습니다 (그리고 오류 처리를 보는 것이 프로그래머가 실제로 얼마나 좋은지를 결정하는 좋은 방법입니다).