지금까지 좋은 의견이 많이 있었으므로 알려 드리겠습니다.
규칙 # 1. 실제로 처리 할 예외 만 잡습니다. 핸들은 클라이언트의 요청을 계속할 수있는 방식으로 처리한다는 의미입니다. 정보를 기록하기에 충분히 길게 잡을 수 있습니다 (악용하지 마세요. 일반적으로 스택은 충분한 정보입니다). 또는 전파하기 쉬운 다른 오류 (Ala Runtime based)로 변환하십시오. 그러나 당신이 그것을 다룰 수 없다면, 그것을 잡는 것을 괴롭히지 마십시오. 그것은 쓸모없고 혼란스러운 추가 코드 일뿐입니다. 당신이 기록하거나 개조 할 때에도, 당신은 재위 재가 끝납니다.
대부분의 시간을 실현하면 예외를 처리 할 수 없습니다. 진실로. 많은 사람들이 이것을 파악하지 못합니다. 하지만 실제로는 디스크에 읽기 또는 쓰기 IOException이 발생하면 게임이 끝난 것입니다. 해당 요청은 사용자에게 완료 될 수 없습니다. 네트워크가 불안정하고 데이터베이스와 통신 할 수없는 경우에도 마찬가지입니다.
규칙 # 2. 처리 할 수없는 예외가 발생하면 수행 할 수있는 유일한 방법은 사용자에게 도움이되는 방식으로 실패를 시도하는 것입니다. 즉, 나중에 분석 (원본 스택/원인 포함)을 위해 기록한 다음 최대한 유용한 정보를 사용자에게보고하십시오. 시스템을 일관된 상태로 유지하기 위해 필요한 것을 정리하십시오.
최종 사용자와의 이러한 통신이 매우 높은 수준에서 발생하면 보통 그 수준을 파악해야합니다. 대부분의 경우, 시작 지점과 사용자에게 로깅 및보고를 위해 catch하는 최상위 수준 사이의 예외 처리에는 거의 가치가 없다는 것을 알게되었습니다. 나는 종종 RuntimeException 형식으로 변환하지만 레이어를 통한 전달을 쉽게하기 위해서만 수행됩니다.
가장 중요한 점은 일반적으로 예외를 처리 할 수 없다는 것을 인식하는 것입니다. 따라서 예외를 작성할 수있는 코드는 가능한 한 간단해야합니다.
스트림에서 문서를 deserialize하려고 할 때 예외가 발생한다고 가정하십시오. 부분적으로 구성된 문서를 포기하고 파일을로드 할 수 없다는 사실을 사용자에게 알리는 경우 예외를 처리해야합니까? – supercat
@supercat - 예. 합리적으로 할 수있는만큼. 무엇이 잘못되었는지와 같은 좋은 오류 메시지를 제공 할 수 있습니다. 그러나 문서를 deserialize하지 못하면 더 이상 무엇을 할 수 있습니까? – rfeak
버려진 문서 이외의 상태를 손상시키지 않는 예외와 손상된 시스템 상태를 나타내는 예외의 차이점을 알려면 어떻게해야합니까? – supercat