C#: 사용자 지정 예외를위한 toString () 메소드 재정
문제
추가 필드가 포함 된 사용자 정의 예외 클래스가 있습니다. 나는 이것들이 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 () 내부에서 결과 문자열을 필요에 맞게 수정 ...