예외의 개념이 소프트웨어 공학 분야에서 아직 성숙하지 못했기 때문에 예외에는 유용한 세부 사항이 포함되어 있지 않으므로 많은 프로그래머가 예외를 완전히 이해하지 못하므로 제대로 처리하지 못합니다.
예. IndexOutOfRangeException
범위를 벗어난 정확한 인덱스와 던져 질 당시 유효한 범위를 포함해야하며, 그렇지 않은 .NET 런타임 작성자를 대신하여 생각할 수 있습니다. 예, Oracle의 table or view not found
예외에는 발견되지 않은 테이블 또는 뷰의 이름이 포함되어야하며, 다시 책임이있는 사람을 대신하여 해당 테이블 또는 뷰 이름을 볼 수 없다는 사실이 포함되어야합니다.
대체로 혼동은 예외에 사람이 읽을 수있는 메시지가 포함되어야한다는 잘못된 생각의 원래 아이디어에서 비롯되며, 이는 예외가 무엇인지에 대한 이해 부족으로 인한 것이므로 악순환입니다.
사람들은 예외에 사람이 읽을 수있는 메시지가 포함되어야한다고 생각하기 때문에 예외에 의해 전달되는 모든 정보도 사람이 읽을 수있는 메시지로 형식화해야하며 모든 사람이 읽을 수있는 메시지를 작성하는 것은 지루합니다. 코드를 작성하거나, 그렇게하는 것은 훔쳐 보는 눈이 메시지를 볼 수있는 모든 것에 불가피한 양의 정보를 누설 할 수 있다고 두려워합니다. (다른 답변에서 언급 한 보안 문제)
그러나 문제의 진실은 예외가해야하기 때문에 그들이 그것에 대해 걱정하지 말아야한다는 것입니다 없는 사람이 읽을 수있는 메시지를 포함하고있다. 예외는 프로그래머 만보고 처리해야하는 것입니다. 사용자에게 장애 정보를 제시 할 필요가있는 경우, 이는 매우 높은 수준에서 정교한 방식으로, 통계적으로 말하면 영어가 아닐 수있는 사용자의 언어로 수행되어야합니다.
따라서 프로그래머에게 예외의 "메시지"는 예외의 클래스 이름 이며 예외 와 관련된 다른 정보는 예외 객체의 (최종 / 읽기 전용) 멤버 변수에 복사해야합니다. 바람직하게는, 모든 가능한 작은 비트. 이런 식으로, 메시지가 생성 될 필요가 없어야하므로 엿보는 눈으로 볼 수 없습니다.
아래 의견에서 Thomas Owens가 표시 한 문제를 해결하려면 다음을 수행하십시오.
물론 어떤 수준에서는 예외에 관한 로그 메시지를 작성 하게됩니다 . 그러나 스택 추적이없는 예외 로그 메시지는 쓸모가 없지만 다른 한편으로는 사용자에게 전체 예외 스택 추적을 표시하지 못하게하는 것입니다. 여기서도 우리의 문제는 우리의 관점이 전통적인 관행에 의해 왜곡된다는 것입니다. 로그 파일은 전통적으로 평범한 텍스트였으며, 우리의 규율이 초기 단계에 있었지만 더 이상은 아닐 수 있습니다. 보안 문제가있는 경우 로그 파일은 이진 및 / 또는 암호화되어야합니다.
이진 또는 일반 텍스트이든, 로그 파일은 애플리케이션이 디버그 정보를 직렬화하는 스트림으로 생각해야합니다. 이러한 스트림은 프로그래머에게만 해당되며 예외에 대한 디버깅 정보를 생성하는 작업은 예외를 디버그 로그 스트림에 직렬화하는 것만 큼 간단해야합니다. 이 방법으로 로그를 보면 예외 클래스 이름을 볼 수 있습니다. (이미 언급했듯이 모든 실제적인 목적을 위해 "메시지"입니다.) 각 예외 멤버 변수는 관련된 모든 것을 설명합니다. 실습에 포함하고 로그 전체 스택 추적. 이 프로세스에서 사람이 읽을 수있는 예외 메시지의 형식이 눈에 띄게 누락 된 방법에 유의하십시오 .
추신
이 주제에 대한 내 생각 중 몇 가지 가이 답변에서 찾을 수 있습니다 . 좋은 예외 메시지를 작성하는 방법
PPS
이진 로그 파일에 대한 나의 제안으로 많은 사람들이 똑딱 거리고있는 것처럼 보이므로 여기서 제안 하는 것은 로그 파일 이 이진 이어야 한다는 것이 아니라는 것을 더 명확하게하기 위해 답을 다시 수정 했습니다. 필요한 경우 로그 파일 이 이진 파일 일 수 있습니다.