제 생각에는 예외는 런타임에 코드 오류를 감지하는 데 필수적인 도구입니다. 테스트와 프로덕션 모두에서. 스택 추적과 함께 메시지를 자세하게 작성하여 로그에서 발생한 일을 파악할 수 있습니다.
예외는 대부분 개발 도구이며 예기치 않은 경우 생산에서 합리적인 오류 보고서를 얻는 방법입니다.
코드를 더 읽기 쉽고 유지 보수 가능하게 만드는 우려 (예상 오류 만있는 일반적인 경로와 예기치 않은 오류에 대한 일반적인 처리기에 도달 할 때까지 떨어지는 행복한 경로)를 제외하고는 가능한 모든 코드를 준비하는 것은 실제로 불가능합니다 읽을 수없는 오류를 처리하기 위해 오류 처리 코드로 부풀려도 예기치 않은 경우가 발생합니다.
그것은 실제로 "예기치 않은"의 의미입니다.
Btw., 예상되는 것과 호출되지 않은 결정은 콜 사이트에서만 가능합니다. 그렇기 때문에 Java에서 확인 된 예외가 해결되지 않은 이유는 API를 개발할 때 예상되거나 예상치 못한 것이 전혀 명확하지 않은 결정입니다.
간단한 예 : 해시 맵의 API에는 두 가지 방법이 있습니다.
Value get(Key)
과
Option<Value> getOption(key)
발견되지 않은 경우 첫 번째 예외를 던지고, 후자는 선택적 값을 제공합니다. 어떤 경우에는 후자가 더 의미가 있지만 다른 경우에는 코드가 주어진 키에 대한 값이 있기를 간절히 기대해야하므로 키가 없으면 기본 코드 때문에 수정할 수없는 오류입니다. 가정은 실패했다. 이 경우 실제로 호출이 실패하는 경우 코드 경로에서 벗어나 일반 처리기로 내려가는 것이 바람직한 동작입니다.
코드는 실패한 기본 가정을 처리하려고 시도해서는 안됩니다.
물론 그것들을 확인하고 잘 읽을 수있는 예외를 던지는 것을 제외하고.
예외를 던지는 것은 악한 것이 아니라 잡는 것일 수 있습니다. 예기치 않은 오류를 수정하지 마십시오. 루프 나 작업을 계속하고 로그를 기록하고 알 수없는 오류를보고하려는 몇 곳에서 예외를 잡아라.
모든 곳에서 캐치 블록은 매우 나쁜 생각입니다.
의도를 쉽게 표현할 수있는 방식으로 API를 설계하십시오 (예 : 키를 찾을 수없는 것과 같은 특정 사례를 예상할지 여부를 선언). 그런 다음 API 사용자는 예상치 못한 상황에 대해서만 통화를 선택할 수 있습니다.
사람들이 예외를 재발송하고 오류 처리 자동화 및 새로운 언어와의 우려를 더 잘 분리하기 위해이 중요한 도구를 생략하여 너무 멀리가는 이유는 나쁜 경험이라고 생각합니다.
그것은, 그리고 그들이 실제로 유익한 것에 대한 오해입니다.
모나드 바인딩을 통해 모든 것을 수행함으로써 그것들을 시뮬레이션하면 코드를 쉽게 읽을 수 있고 유지 보수 할 수 없으며 스택 추적이 없어 결국이 방법을 악화시킬 수 있습니다.
기능적 스타일 오류 처리는 예상되는 오류 사례에 적합합니다.
예외 처리가 자동으로 나머지를 모두 처리하도록하십시오.
panic
똑같지 않은 것을 무시하면 목록에 Go를 추가 할 수 있습니다 . 또한 거기에서 말한 바와 같이 예외는GOTO
분명한 이유로 아무도 그렇게 부르지 않지만 을 수행하는 정교하고 편안한 방법에 지나지 않습니다 .