2011-06-11 4 views
5

로깅 프로그램을 만들고 있는데 중첩 된 호출 구조를 통해 반복적으로 기록되기 때문에 동일한 Exception 개체를 반복적으로 기록하지 않도록하고 싶습니다. 그래서 Exception 개체를 한 번 포맷하고 형식이 지정된 버전에 고유 한 "예외 번호"를 부여한 다음 Exception 개체에 태그를 지정하면 나중에 로그 호출시 다시 인식 할 수 있습니다.(잘못) Exception.HelpLink를 사용하여 Exception 객체를 인식 할 수 있습니까?

내가 생각해 낸 아이디어는 Exception 개체의 HelpLink 필드를 오용하는 것입니다. 내 "예외 번호"의 문자열 버전을 포함하도록 설정하겠습니다. 그런 다음 다른 로그 호출에서 잠시 다시 나타나면 Exception 개체를 인식 할 수 있습니다.

하지만 이것은 나쁜 생각일까요? 내가 생각지 못했던 문제가 있습니까? 그렇다면 누구나 더 좋은 아이디어가 있습니까?

편집 : 상황을 좀 더 자세히 설명하면이 로거는 내 프로그램에서만 사용됩니다.

+1

나는 그 자체로 질문하는 것이 대답이 무엇인지 명확히 드러내는 것이라고 생각한다. – casperOne

답변

7

'abusing'HelpLink 속성 대신 Data property을 사용하여 Exception에 추가 정보를 추가 할 수 있습니다. 여기에는 예외에 대한 추가 사용자 정의 정보를 제공하는 키/값 쌍이 들어 있습니다.

+1

HelpLink를 남용한다는 생각으로 나는 LOL에게해야만했다. 한밤중에 HelpLink Abuse Hotline이 전화를 받았다는 갑작스런 비전을 가지고있었습니다 ... –

+0

핫라인으로 전화를 걸 수있는 활동에 참여하는 것보다 훨씬 좋은 아이디어입니다. . – RenniePet

+1

더 악화 될 수 있습니다 - 나는 당신이 등록 재산 남용자 목록에 올라 가기를 원하지 않는다는 것을 의미합니다.) –

2

Exception.HelpLink은 로거가 주어진 형식이나 기본 형식으로 만 예외 정보를 로깅하는 것과 관련되어 있으므로 확실히 사용하지 마십시오. 동일한 예외가 계속해서 반복되는 경우 로거가 아니라 실행중인 어셈블리 또는 프로그램의 문제입니다.

더 나은 여전히 ​​사용자가 만든 로그 파일 또는 데이터베이스 테이블에서 형식/그룹 예외에 대한 로깅 및 사용자 정의보고 인터페이스 log4net을 사용하는 옵션을 탐색 할 수 있습니다/log4.net

+0

답변 해 주셔서 감사합니다. 제 질문에 편집 한 내용을 참조하십시오. 저는 현재 log4net을 사용하고 있지만 집에서 만든 로거로 바꾸고 있습니다. 또한 예외 상황은 예외 처리를 작성하는 방식에 대해 중첩 된 호출 구조를 통해 "퍼콜 레이션 (percolates)"되어 정상적으로 작동하는 것으로 여러 번 기록됩니다. – RenniePet

3

업데이트 나는 TheVillageIdiot, 내가 동의하는 동안 보다 일반적으로 말하자면, Exception의 동작을 변경하려면 추가 된 적절한 정보를 추가하는 Exception 클래스를 만들어야합니다. 결국 우리는 상속과 다형성을 사용합니다. :)

+0

매우 유용한 제안이지만 다시 로거가 필요합니다. 사용자 정의 예외 클래스에 대해 알아야합니다. 그는 일반적인 로깅 메커니즘 위에 애플리케이션 특정 계층을 사용할 수 있습니다. – TheVillageIdiot

+0

물론 - 당신이 말했듯이, 여기의 문제는 구조에 있습니다. 이러한 중복 레코딩을 피하기 위해 최상위 레이어를 제외하고는 예외 로깅이 발생해서는 안됩니다. –

0

아니요 HelpLink를 오용하지 않아도됩니다. 추가 속성이 필요한 경우 @Greebo가 언급했듯이 자신 만의 예외 클래스를 만들 수 있습니다. 대안으로 System.Exception 클래스의 일부인 Data 속성을 사용할 수도 있습니다.

질문 : 예외 처리기가 로깅 이외의 처리를하고 있습니까?

그렇다면 핸들러가 필요하지 않을 가능성이 큽니다. 예외 (finally 블록을 사용하여 정리)를 호출 스택 위로 버블 링하여 최 ​​외 계층에서 처리하도록하십시오. 핸들러에서 예외를 처리하는 경우 왜 스택에서 동일한 예외를 처리해야하는지 확신 할 수 없습니다. 나는 당신이 처리 된 내부 예외를 설정하는 새로운 예외를 생성 할 가능성이 더 높을 것이라고 생각한다.

0

코드가 모든 레벨에서 예외를 포착하고 로깅해서는 안됩니다. 코드에서 동일한 예외가 두 번 표시 될 이유는 없습니다. 이것은 당신이 "모든 예외 잡기"를 사용하는 것과 매우 흡사합니다. 이것은 모든 주요 예외 패턴입니다.

관련 문제