시스템이 예외를 올바르게 전달하고 처리하는 데 필요한 많은 요구 사항이 있습니다. 개념을 구현하기 위해 언어를 선택할 수있는 옵션이 많이 있습니다.
예외 요구 사항 (특별한 순서는 아님) :
문서화 : 언어에는 API에서 발생할 수있는 예외를 문서화 할 수단이 있어야합니다. 이상적으로이 설명서 매체는 컴파일러와 IDE가 프로그래머를 지원할 수 있도록 기계로 사용할 수 있어야합니다.
예외적 인 상황 전송 :이 기능은 피 호출 기능이 예상되는 동작을 수행하지 못하게하는 상황을 전달할 수있는 기능입니다. 제 생각에는 그러한 상황에는 세 가지 큰 범주가 있습니다.
2.1 일부 데이터가 유효하지 않은 코드 버그.
2.2 구성 또는 기타 외부 리소스 문제.
2.3 본질적으로 신뢰할 수없는 리소스 (네트워크, 파일 시스템, 데이터베이스, 최종 사용자 등) 신뢰할 수없는 특성으로 인해 산발적 인 실패를 예상해야하기 때문에 이는 약간의 모퉁이 사례입니다. 이 경우 이러한 상황은 예외적 인 것으로 간주됩니까?
코드가 처리 할 수 있도록 충분한 정보를 제공 하십시오 . 예외는 수신자에게 상황에 대응하고 처리 할 수 있도록 충분한 정보를 제공해야합니다. 또한이 예외가 기록 될 때 프로그래머가 문제의 진술을 식별하고 격리하고 솔루션을 제공 할 수있는 충분한 컨텍스트를 제공 할 수 있도록 정보가 충분해야합니다.
프로그래머에게 코드 실행 상태의 현재 상태에 대한 자신감을 제공하십시오 . 소프트웨어 시스템의 예외 처리 기능은 프로그래머가 방해하지 않고 필요한 안전 장치를 제공 할 수있을만큼 충분히 있어야합니다. 손.
이를 다루기 위해 다음 방법이 다양한 언어로 구현되었습니다.
확인 된 예외 예외 를 문서화하는 좋은 방법을 제공하며 이론적으로 올바르게 구현되면 모든 것이 양호하다는 충분한 확신을 제공해야합니다. 그러나 비용은 많은 사람들이 예외를 삼키거나 단순히 확인되지 않은 예외로 다시 던져서 단순히 우회하는 것이 더 생산적이라고 느끼게합니다. 부적절하게 검사 된 예외를 사용하면 유용성이 거의 없어집니다. 또한 확인 된 예외로 인해 시간이 안정적인 API를 작성하기가 어렵습니다. 특정 도메인 내에서 일반 시스템을 구현하면 예외적으로 확인 된 예외를 사용하여 유지 관리하기 어려운 예외적 인 상황이 발생합니다.
확인되지 않은 예외 -확인 된 예외보다 훨씬 더 다양한 기능은 주어진 구현의 예외 상황을 올바르게 문서화하지 못합니다. 그들은 임시 문서에 의존합니다. 이로 인해 매체의 신뢰할 수없는 특성이 안정성으로 보이는 API로 마스킹되는 상황이 발생합니다. 또한 이러한 예외가 발생하면 추상화 계층을 통해 다시 올라감에 따라 그 의미가 풀립니다. 문서화가 잘되어 있지 않기 때문에 프로그래머는 구체적으로 목표를 정할 수 없으며, 보조 시스템이 고장 나더라도 전체 시스템을 중단시키지 않도록하기 위해 필요한 것보다 훨씬 더 넓은 네트워크를 캐스팅해야하는 경우가 종종 있습니다. 제공된 삼키는 문제를 확인한 예외로 되돌아갑니다.
다중 상태 반환 유형 여기서는 예상치 못한 결과 또는 예외를 나타내는 객체를 반환하기 위해 분리 세트, 튜플 또는 기타 유사한 개념에 의존합니다. 여기에서 스택 해제, 코드 절단 없음, 모든 것이 정상적으로 실행되지만 반환 값은 계속하기 전에 오류가 있는지 확인해야합니다. 나는 실제로 이것으로 작업하지 않았기 때문에 경험에서 언급 할 수 없다. 나는 정상적인 흐름을 우회하는 예외 문제를 해결한다고 인정하지만 여전히 피곤하고 지속적으로 "당신의 얼굴에있는"체크 예외와 같은 문제로 고통받을 것입니다.
그래서 질문은 :
이 문제에 대한 당신의 경험은 무엇이며, 당신에 따르면 언어가 가질 수있는 훌륭한 예외 처리 시스템을 만드는 가장 좋은 후보자는 무엇입니까?
편집 :이 질문을 쓴 후 몇 분 후에 나는 이 게시물 을 보았습니다.
noexcept
C ++로 이야기를 보면 C # 및 Java에서도 EH에 대한 훌륭한 통찰력을 얻을 수 있다고 생각 합니다.)