2011-01-20 2 views
1

기존 코드를 약간 개선했습니다. 이제 예외가 발생할 때마다 어디에서나 하나의 메시지를 기록하려고합니다.예외가 발생할 때마다 어디에서나 예상되는 동작이 수행되도록하는 방법은 무엇입니까?

catch/finally 블록에 해당 메시지를 추가 할 수 있지만 수백 개의 catch 블록이 있습니다.

누구든지 어셈블리의 코드 부분에서 예외가 발생할 때마다 메시지를 기록하는 것이 더 나은 방법을 제안 할 수 있습니까?

+0

불행히도 블록을 수정해야합니다. 또는 주석을 달고 AppDomain.CurrentDomain.UnhandledException + = (TopLevelErrorHandler); Application.ThreadException + = Application_ThreadException; –

+0

모든 예외를 포착하여 임의의 실패를 유도 할 때 실제로 * 강력한 * 로깅이 필요합니다. 하지만 거기서 멈추지는 않습니다, 당신은 또한 도구로 인해 데이터 손상을 복구해야합니다. 이러한 모든 try/catch 문을 삭제하면됩니다. –

답변

2

두 번째 테이크 :

좋은 접근법은 Postsharp를 사용한 AOP입니다.

많은 프로젝트에서 사용했습니다.

PostSharp API의 기본 속성을 상속하는 속성을 정의 할 수 있습니다.이 속성을 사용하면 사용자 정의 속성을 배치 할 메소드 호출을 가로채는 것을 허용 할 수 있습니다.

모든 속성에 속성을 추가하면 메서드 본문을 모두 시도하거나 잡을 수 있으며 결국에는 예외를 제어하고 로깅 할 수 있습니다.

성 동적 프록시와 동일한 목표를 달성 할 수 있지만, 이는 인터셉터를 사용하여 프록시 클래스를 만들고 팩터 리로 클래스를 인스턴스화 할 수 있으므로 런타임 솔루션입니다. 분명히 이것은 더 많은 자원을 소비하고 있습니다.

Postsharp는 IL 직조를 수행합니다. 즉, 인터셉터가 컴파일 타임에 실제 코드에 삽입되므로 런타임 성능이 저하되지 않습니다.

요약하면 "LogAttribute"를 작성하여 예외를 발생 시키거나 기록하려는 모든 메소드에 배치 할 수 있습니다.

+0

+1 : 아주 좋은 옵션. 그 생각은. NET에서 아직 AOP를 사용하지 못했습니다. 특정 개발 비용이 있지만 질문자가 그것을 기꺼이 감당할 수 있는지 여부를 모릅니다. –

+0

실제로 Postsharp에는 커뮤니티 에디션이 있으므로 사용 비용이 들지 않습니다. 나는 Postsharp가 잘 문서화되어 있고 그것을 사용하는 것이 극단적으로 쉽다고 생각하지 않습니까? –

0

확실히 마지막 기회 예외 처리기가 있습니다.

ASP.NET은 HttpApplication에서 오류 이벤트 (HTTP 모듈을 사용하지 않는 경우 Global ASAX에서 대부분의 시간)를 사용합니다.

WPF와 Silverlight는 응용 프로그램에 있습니다.

그리고 Windows Forms는 AppDomain.UnhandledException 이벤트를 사용할 수 있습니다.

미카 자코비 말이 맞습니다. 이것은 잘못된 답변입니다. 그 죄송합니다.

+0

이 명제는 작동하지 않습니다. 그가 찾고있는 것은 기존의 try/catch 블록에 추가 할만한 것입니다. –

+0

그것이 제가하는 방법입니다. 처리 된 예외는 발생하지 않습니다. –

+0

@Michael : 처리 된 예외를 AppDomain.UnhandledException으로 우회하는 법? –

1

기존 코드를 처리해야 할 때 흥미로운 문제입니다.

당신은 정말이 catch 블록을 변경하지 않으 은, 그때 해결 제안 할 수있는 경우 : 당신이있어

하나의 옵션이 작성됩니다 LoggedExceptionInterface 또는 무엇이든, 그것은에 LogEvent을 구현하고 모든 감사 처리 된 예외 유형을 검색하고 인터페이스를 추가하여 코드를 다시 정의하는 코드.

예를 들어, 을 LoggedIOException으로 바꿉니다. 여기서 후자는 첫 번째를 상속하며 LoggedExceptionInterface을 맨 위에 구현합니다.

물론 이것은 catch 블록을 개별적으로 변경하는 것보다 무거울 수 있습니다. 선택은 사용자의 선택입니다.

+0

감사합니다. 이것은 좋은 솔루션 인 것 같습니다. 앞으로도 다른 개발자들이 모든 catch 블록의 끝 부분에서 확실한 조치를 취할 때마다 기억할 것을 기대할 필요가 없기 때문입니다! – Learner

+0

upvote를 잊지 마라. (그리고/또는 만족스럽게 대답하면) Mathias가 권고 한대로 AOP가 더 깔끔하고 애호가가 될 수도 있음을 고려해 보라. (약간 무겁고 덜 직관적 임) –

+0

IL 직조의 마법은 AOP는 컴파일 시간과 배경 때문에 가벼워졌습니다. 나는 그 접근법을 정말 좋아합니다. (당신은 확실히 그것을 지적했습니다.) –

관련 문제