간단하게 유지합니다.
라이브러리에는 std ::: runtime_error에서 확장 된 기본 예외 유형이 있습니다 (C ++에서 다른 언어에 적절하게 적용됨). 이 예외는 메시지 문자열을 가져 오므로 기록 할 수 있습니다. 모든 던지기 지점에는 고유 한 메시지가 있습니다 (보통 고유 한 ID).
그게 다야.
참고 1 : 누군가 예외를 잡는 상황에서는 예외를 수정하고 조치를 다시 시작할 수 있습니다. 원격 위치에서 고유하게 수정 될 수있는 항목에 대해서는 파생 예외를 추가합니다. 그러나 이것은 매우 드문 일입니다. 포수가 던지기 지점에 가까워 질 가능성이 적으므로 문제를 해결하는 것이 어려울 것입니다 (그러나 모든 것이 상황에 달려 있음).
참고 2 : 때로는 라이브러리가 너무 단순하여 자체 예외를 제공 할 가치가 없으며 std :: runtime_error가 수행합니다. std :: runtime_error와 구별 할 수있는 기능으로 사용자에게 무언가를 할 수있는 충분한 정보를 제공 할 수있는 경우에만 예외를 갖는 것이 중요합니다.
참고 3 : 클래스 내에서 일반적으로 오류 코드를 선호합니다 (그러나 클래스의 공용 API에서 절대로 벗어날 수는 없습니다).
장단점을 보면 :
내가 보는 단점은 다음과 같습니다.
더 많은 예외 클래스는 API 사용자에 대해 매우 세밀한 수준의 오류 처리를 허용 할 수 있습니다 (사용자 구성 또는 데이터 오류가 발생하거나 파일을 찾을 수 없음)
더 많은 예외가 실제로 더 미세한 입자 제어를 제공합니까? 문제는 catch 코드가 실제로 예외를 기반으로 오류를 해결할 수 있습니까? 나는 그런 상황이 있다고 확신하며,이 경우 다른 예외가 있어야합니다. 그러나 위에 나열된 유일한 예외 사항은 큰 경고를 생성하고 응용 프로그램을 중지하는 것입니다.
더 많은 예외 클래스를 사용하면 문자열 메시지 나 오류 코드가 아니라 오류 관련 정보를 예외에 포함시킬 수 있습니다.
이것이 예외를 사용하는 큰 이유입니다. 그러나 정보는 캐싱하는 사람에게 유용해야합니다. 정보를 사용하여 일부 수정 작업을 수행 할 수 있습니까? 객체가 라이브러리 내부에 있고 API에 영향을주는 데 사용할 수없는 경우 정보가 쓸모가 없습니다. 던져진 정보는 그것을 잡을 수있는 사람에게 유용한 가치를 지니고 있어야합니다. 정보를받는 사람은 일반적으로 공개 API 외부에 있으므로 공개 API의 정보와 함께 사용할 수 있도록 정보를 조정하십시오.
그들이 할 수있는 모든 것이 예외를 기록하는 것이라면 많은 양의 데이터보다는 에러 메시지를 던지는 것이 가장 좋습니다. 포수가 일반적으로 데이터와 함께 오류 메시지를 작성합니다. 오류 메시지를 작성하면 모든 포수에서 일관성이 유지됩니다. 캐처가 오류 메시지를 작성하도록 허용하면 전화를 걸고 잡는 사람에 따라 동일한 오류가 다르게보고 될 수 있습니다.
예외는 적지 만 조회로 사용할 수있는 오류 코드 포함
오류 코드를 의미있게 사용할 수있는 날씨를 결정해야합니다. 가능한 경우 자체 예외가 있어야합니다. 그렇지 않으면 사용자는 이제 catch 내부에서 switch 문을 구현해야합니다 (catch가 자동으로 물건을 처리하는 전체 요점을 무너뜨림).
그렇다면 예외에서 오류 메시지를 사용하지 않는 이유는 무엇입니까?
함수에서 직접 오류 코드 및 플래그 반환 (때로는 스레드에서 불가능)
내부적으로 오류 코드를 반환하는 것이 좋습니다. 버그를 수정 한 다음 모든 오류 코드를 수정하고이를 확인해야합니다. 그러나 공개 API에서 유출하는 것은 나쁜 생각입니다. 문제는 프로그래머가 종종 오류 상태를 확인하는 것을 잊어 버린다는 것입니다. (적어도 예외로 확인하지 않은 오류는 응용 프로그램에서 처리되지 않은 오류를 강제로 종료하면 일반적으로 모든 데이터가 손상됩니다).
오류 발생시 이벤트 또는 콜백 시스템 구현 (스택 풀기 방지)
이 방법은 종종 다른 오류 처리 메커니즘과 함께 사용됩니다 (대안이 아님). Windows 프로그램을 생각해보십시오. 사용자는 메뉴 항목을 선택하여 작업을 시작합니다. 이벤트 큐에서 조치를 생성합니다. 이벤트 큐는 결국 조치를 처리 할 스레드를 지정합니다. 스레드는 조치를 처리하고 결국 스레드 풀로 돌아가서 다른 태스크를 기다립니다. 여기서 작업을 수행하는 스레드가 기본에서 예외를 포착해야합니다. 예외를 포착 한 결과 일반적으로 기본 루프에 대해 이벤트가 생성되어 결국 사용자에게 오류 메시지가 표시됩니다.
그러나 예외에 직면 할 수 없다면 스택이 풀릴 것입니다 (적어도 스레드의 경우).