2008-09-07 4 views
11

잘못 될 수있는 매우 구체적인 문제에 대한 사용자 지정 예외가 생성되었습니다. 다른 시스템에서 데이터를받습니다. 데이터를 구문 분석하는 동안 폭탄이 발생하면 예외가 발생합니다. 내 사용자 정의 예외에서 "ResponseData"라는 필드를 추가 했으므로 코드가 처리 할 수없는 것을 정확히 추적 할 수 있습니다.사용자 지정 예외에 추가 정보 추가

이와 같은 사용자 지정 예외에서 여분의 응답 데이터가 예외 "message"에 들어가야합니까? 그것이 있으면 메시지가 커질 수 있습니다. 나는 Elmah를 사용하고 있기 때문에 거기서 그것을 원합니다. 그게 제가 그 데이터를 얻을 수있는 방법입니다. 추가 예외 정보는 "메시지"속성으로 이동해야 - - 어떻게 ELMAH 사용자 정의 예외 또는 의 필드에서 추가 정보를 기록 할 수 있습니다 :

그래서 질문 중 하나입니까?

답변

6

.Message을 디버그 정보로 채우지 말고, 간결하고 유용한 텍스트로 채우십시오.

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

메시지의 텍스트가 완전히 오류를 설명해야하고, 가능하면, 그것을 해결하는 방법을 설명한다

. Message 속성 값은 ToString에서 반환 한 정보에 포함됩니다.

메시지 속성은 예외를 만들 때만 설정됩니다. 현재 인스턴스에 대해 생성자에 메시지가 제공되지 않은 경우 시스템은 현재 시스템 문화권을 사용하여 포맷 된 기본 메시지를 제공합니다.

[...] 상속자

주 :

메시지 속성 메시지 콘텐츠 또는 포맷에 대한 제어를 요구 클래스에서 재정의된다. 응용 프로그램 코드는 일반적으로 발견 된 예외에 대한 정보를 표시해야 할 때이 속성에 액세스합니다.

오류 메시지는 현지화되어야합니다.

응답 데이터는 설명의 자격이 없습니다.

elmah에 익숙하지 않아 사용하는 동안 Exception 클래스를 확장하는 방법을 알 수 없습니다. elmah가 자체 서브 클래스를 Exception으로 구현합니까? 아니면 인터페이스? 직접 서브 클래 싱 할 수 있습니까?

0

나는 System.Exception을 확장하고 있으며 이미 Elmah 필드를 추가했다는 의문을 가지고 있지 않습니다. 그것이 어디에 속해 있는지 - 예외 자체의 공공 재산입니다.

1

질문을 완전히 이해하지 못했지만 추가 예외 데이터를 어떻게 처리해야하는지 묻는 것처럼 보입니다. 질문을 무시하는 것이 좋습니다.

내가 물어야 할 중요한 질문은 정확히 예외 메시지가 무엇인가하는 것입니다. 예외가 발생한 곳을 알기위한 것이 아니라 스택 추적이 그 것이다. InnerException 필드를 사용하여 예외를 캡슐화하지 않는 것이 일반적입니다. 예외가 코드의 특정 위치에서만 발생하는 경우에는 어떤 종류의 오류가 있는지 설명하지도 않습니다. 즉 예외 유형이 무엇인지 설명하는 것입니다.

일반적으로 필자는 사용자가 읽을 수없는 간단한 팁을 제공하기 위해 메시지 필드를 사용합니다. 처음에는이 오류를보고 프로그래머가 기본 시스템을 이해하는 데 사용할 수 있습니다. 메시지 필드가 짧은 (한 문장) 설명,이 오류가 자주 제기되는 방법에 대한 힌트 또는 추가 읽기에 대한 참조에 적합하다고 생각합니다.

귀하의 질문을 이해하는 한, 다른 시스템에서받은이 '추가 정보'를 저장하는 가장 좋은 방법은 InnerException입니다. 나는 엘마를 모르지만, 소금이 가치가 있다면 InnerExceptions를 확인하고 보관할 것입니다.

0

Elmah는 처리되지 않은 예외를 기록하는 HTTP 모듈입니다.

나는 그것이 사용자 정의 필드를 저장하지 않기 때문에 Elmah의 한계라고 생각합니다. 나는 그 사람들에게 물어야 할 것 같아. 나는 거기에 응답 데이터를위한 여분의 필드를 가지고 있지만, Elmah는 그것을 저장하지 않습니다. 사용자 정의 예외에서

11

등이 하나, 는 여분의 응답 데이터는 예외 "메시지"로 를 가야하나요?

아니요, Sören already pointed out. 그러나 예외 유형은 ToString을 무시하고 응답 데이터 정보를 현명하게 추가 할 수 있습니다. 이것은 BCL (기본 클래스 라이브러리)의 많은 예외 유형이 따르는 완벽하게 정상적인 방법이므로 자신이 조수에 맞서 수영하는 것을 발견하지 못합니다.

당신이 볼 수 있듯이
public override String ToString() 
{ 
    String s = GetType().FullName + ": " + Message; 

    if (_fileName != null && _fileName.Length != 0) 
     s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName); 

    if (InnerException != null) 
     s = s + " ---> " + InnerException.ToString(); 

    if (StackTrace != null) 
     s += Environment.NewLine + StackTrace; 

    try 
    { 
     if(FusionLog!=null) 
     { 
      if (s==null) 
       s=" "; 
      s+=Environment.NewLine; 
      s+=Environment.NewLine; 
      s+="Fusion log follows: "; 
      s+=Environment.NewLine; 
      s+=FusionLog; 
     } 
    } 
    catch(SecurityException) 
    { 

    } 
    return s; 
} 

, 그것은 어셈블리로드 실패의 경우 추가 정보를 표현 FusionLog 재산의 내용을 추가합니다 : 예를 들어, SSCLI (Rotor)System.IO.FileNotFoundException.ToString 구현을 살펴 있습니다.

어떻게 예외를 사용자 지정에 오류의 세부 사항과 같은 예외에 ToString를 호출 한 결과를

ELMAH 저장 필드에서 추가 정보를 기록하는 ELMAH를 얻을 수 있습니다 그래서 만약 당신이 ToString을 처방대로 구현하면 추가 작업없이 정보가 기록됩니다. 유일한 문제는 기록 된 세부 정보가 구조화되지 않았 음을 의미합니다. 텍스트.

4

Exception 클래스에는 사용자 지정 데이터를 바닐라 예외와 연결하는 데 사용할 수있는 사전 (이름 : Data, 나는 믿습니다)이 있습니다.

+0

http://msdn.microsoft.com/en-us/library/system.exception.data(v=vs.110).aspx –

+0

예외가 serialize 된 경우 해당 내부의 모든 내용을 직렬화 할 수 있어야합니다. 그래서 당신의 객체가 복잡하다면 필요한 것을 추출하는 것이 좋다. –

관련 문제