문제

추가 필드가 포함 된 사용자 정의 예외 클래스가 있습니다. 나는 이것들이 ToString() 방법이지만 내 자신을 구현하는 경우 ToString(), 나는 다른 유용한 것들 (예외 유형 이름, 내부 예외 데이터 및 스택 추적)을 느슨하게합니다.

자신의 구현을위한 가장 좋은 방법/패턴은 무엇입니까? ToString() 그러한 예외를위한 방법? 이상적으로는 기존 메커니즘을 재사용해야하지만 기본값과 유사하게 형식화됩니다. ToString() 구현.

업데이트 : 내 사용자 정의 필드를 Base.toString () 텍스트에 선물 또는 추가하는 것은 이상적이지 않습니다.

PimTool.Utilities.OERestServiceUnavailableException: test ---> System.InvalidOperationException: inner message
   --- End of inner exception stack trace ---
   at PimTool.Tests.Services.OE.OERestClientTests.ExceptionsLogging() in D:\svn\NewPimTool\PimTool.Tests\Services\OE\OERestClientTests.cs:line 178, 
   StatusCode=0, message='test', requestId='535345'

(잠재적으로 긴) 예외 설명 끝에 사용자 정의 필드가 작성되었음을 의미합니다. 반면에, 나는 예외 유형이 설명에 작성된 첫 번째 정보가되기를 원합니다.

업데이트 2 :이를위한 솔루션을 구현했습니다. 아래에서 내 자신의 답변을 찾으십시오.

도움이 되었습니까?

해결책 3

좋아, 이것이 내가 생각해 낸 것입니다. 예외를 형식화하기위한 원래 메커니즘을 복제하는 확장 클래스를 구현했지만 Twist : 사용자 정의 필드 형식을위한 플러그인을 제공하는 사용자 정의 작업 대의원 :

public static class ExceptionFormatterExtensions
{
    public static string ExceptionToString (
        this Exception ex, 
        Action<StringBuilder> customFieldsFormatterAction)
    {
        StringBuilder description = new StringBuilder();
        description.AppendFormat("{0}: {1}", ex.GetType().Name, ex.Message);

        if (customFieldsFormatterAction != null)
            customFieldsFormatterAction(description);

        if (ex.InnerException != null)
        {
            description.AppendFormat(" ---> {0}", ex.InnerException);
            description.AppendFormat(
                "{0}   --- End of inner exception stack trace ---{0}",
                Environment.NewLine);
        }

        description.Append(ex.StackTrace);

        return description.ToString();
    }
}

이제 포맷 코드를 복제하지 않고도 자신의 toString () 구현 에서이 메소드를 사용할 수 있습니다.

    public override string ToString()
    {
        return this.ExceptionToString(
            description =>
            {
                description.AppendFormat(
                    ", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
            });
    }

다른 팁

이것은 모두 과잉입니다. 예외는 메시지 속성을 무시해야합니다.

public override String Message {
    get {  
        return base.Message + String.Format(", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
    }
}

예외 클래스의 기본 ToString 메소드는 기본적으로 "ClassName: Message --> InnerException.ToString() StackTrace". 따라서 메시지를 재정의하면 메시지 텍스트가 정확히 어디에 있어야하는지 정확히 설명합니다.

반환 된 문자열에 기본 데이터를 수동으로 추가 할 수 있습니다. ToString, 예외 속성을 보면. 예를 들어, 다음은 기본적으로 반환 된 데이터를 예외로 시뮬레이션합니다. ToString 메소드 (내부 예외가 없다고 가정) :

string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);

또는, 당신은 단순히 base.ToString 추가하려는 정보에.

ToString () 메소드를 무시하여 고유 한 사용자 정의 정보를 포함시키고 다음과 같은 기본 기본 예외 ToString ()을 호출 할 수 있습니다.

public class MyException : Exception
{
    public string CustomField { get; set; }
    public override string ToString()
    {
        return CustomField + Environment.NewLine + base.ToString();
    }
}

주로 디버거에서 그들을보고 있다면 [DebuggerDisplay] 형식을 지정하고 기존에 닿지 않도록 속성 ToString 방법.

그렇지 않으면 과부하 ToString 기본 클래스 버전을 호출하십시오 base.ToString()

재정의 통화 base.toString () 내부에서 결과 문자열을 필요에 맞게 수정 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top