도서관에서 작업 중이고 라이브러리에서 발생하는 모든 예외에 문맥 정보를 추가하고 싶습니다. 에는 라이브러리와 관련이없는 예외가 포함되어 있습니다 (예 : System.NullReferenceException
. (아마도이 추가 정보는 개발자가 코드 및/또는 데이터 문제를 디버그하는 데 도움이됩니다.) EDIT : 내 라이브러리는 중첩 될 수있는 큰 데이터 구조를 처리 중입니다. 그래서 예외가 발생했을 때 처리되는 필드의 전체 경로를 추가 정보로 포함하려고합니다. MyClass.Field1.SomeArray[10].SomeOtherField.ThisFails
. (이 경우에는 예외로 추가 할 수있는 매우 유용한 정보라고 생각합니다.)도서관 예외에 추가 정보를 포함하는 방법
해결 방법 1. 포장에 예외 상황 정보를 추가하는 것이 좋습니다. 하지만 큰 단점이 있다고 생각합니다. 예외 유형을 변경해야합니다. 예를 들어, OutOfMemoryException
은 라이브러리 특정 예외로 래핑되고 응용 프로그램이이 특정 예외 을 처리하는 것이 훨씬 더 어려울 것입니다 (개발자는 InnerException
속성의 유형을 확인해야합니다). 그래서 예외를 래핑하지 않으려합니다. 랩핑에 대한 추가 고려 사항은 내 라이브러리가 사용자가 구현 한 일부 객체와 함께 작동하여 특정 예외를 throw 할 수 있으며 이러한 예외의 유형을 수정하고 싶지 않다는 것입니다.
해결 방법 2. Exception.Data
사전을 사용하여 예외에이 추가 정보를 포함하십시오. 이 솔루션의 단점은 추가 정보가 Exception.ToString()
의 기본 구현 결과에 포함되지 않는다는 것입니다. (Exception.ToString()
의 결과에 추가 정보를 포함 시키므로 log.Write(ex.ToString());
과 같은 예외를 기록하는 개발자가 쉽게 볼 수 있으므로이 방법으로 dvelopers는 다른 형식 지정 방법을 호출하는 방법을 배우지 못합니다. 내 라이브러리에서)
편집 :. 솔루션 3. 나는이 readolnly 때문에) (반사를 사용하여 exception.Message
필드의 끝에서 내 정보를 추가 생각했다. 왜 이것을 피해야하는지에 대한 충분한 이유가 있습니까?
설명 된 단점을 피할 수있는이 문제에 대한 가능한 다른 해결책이 있습니까? 다른 더 나은 솔루션이 없다면 가장 일반적인 구현은 무엇입니까?
편집 : 나는, 그것을 명확하게하기 위해이 도서관이기 때문에, 나는 그들이 읽을 사용자가 사용할 로깅 예외의 종류 및 얼마나 많은 라이브러리 설명서의 많은 통제권을 가지고 있지 않고, 원하는 . ex.ToString()
의 결과에 최대한 많은 정보를 포함시켜 무의미한 지원 요청을 피하고 싶습니다.
또한 성능은이 라이브러리에 중요합니다 (마케팅 용일 수도 있지만 더 중요합니다). 따라서 잘 작동하는 시나리오에 대해서는 추가 처리가 필요하지 않습니다. 가능한 경우 데이터가 잘못된 경우 if (data.Field == null) throw new ArgumenNullException("someField");
과 같은 몇 가지 추가 검사를 피하기 위해 나중에 편리한 위치에서 catch하고 사용할 수있는 NullReferenceException
코드가 조금씩 실패합니다. 일부 메소드는 데이터를 추가합니다.당신이 Exception.Data
에서 물건 기본 ToString()
을 결합 할 수있는 유형 Exception
에 확장 방법으로, 새로운 방법과 같은 ToLogString()
을 추가하는 열려있는 경우
종속성 주입 예외 처리기를 사용하고 모든 클래스의 예외가 유입됩니다. 핸들러는 예외를 forgivable, unforgivable, tolerated 등으로 분류하고 모든 로깅을 수행합니다. –
@GayotFow는 구현에 대해 더 자세히 설명해 줄 수 있습니까 (이 질문에 대한 대답 일 수도 있습니다). –
의존성 주입을 사용하고 있습니까? 그게 당신의 패턴이라면 나는 갈 수 있습니다. –