当前位置: 首页 > 编程语言 > C#

记录异常属性分享

时间:2023-04-11 02:02:49 C#

记录异常属性可以用NLog记录异常属性吗?例如,SocketException具有ErrorCode、HResult、NativeErrorCode等属性,这些属性仅针对此类异常。是否可以Log(e.ErrorCode)它们并在代码中使用ErrorException而无需显式记录(即不使用Log(e.ErrorCode))?默认的异常布局渲染器只是在异常上调用ToString。我不知道这是否是个好主意,但您可以编写自己的LayoutRenderer。为了简单起见,我只是写了一个继承自ExceptionLayoutRenderer并重写Append方法的方法。[LayoutRenderer("ExtendedException")]publicclassExtendedExceptionLayoutRenderer:ExceptionLayoutRenderer{protectedoverridevoidAppend(System.Text.StringBuilderbuilder,LogEventInfologEvent){base.Append(builder,logEvent);var异常=logEvent;isException(ifSocketException){varsockException=(SocketException)异常;builder.Append(sockException.ErrorCode).Append("").Append(sockException.SocketErrorCode);SocketException处理不是很复杂。我敢肯定有更好的方法,但它显示了如何做到这一点。要激活你必须像这样调整你的配置:编辑好的,我不知道你想要每个异常的功能及其自己的属性。如果您只对其他几个感兴趣,您可以添加更多if(exceptionisYourExceptionType)并调整您感兴趣的属性。更通用的方法是使用反射来记录所有定义的属性异常。[LayoutRenderer("ExtendedException")]publicclassExtendedExceptionLayoutRenderer:ExceptionLayoutRenderer{protectedoverridevoidAppend(System.Text.StringBuilderbuilder,LogEventInfologEvent){varexception=logEvent.Exception;vartype=exceptions.Get.GetProperties(BindingFlags.DeclaredOnly|BindingFlags.Instance|BindingFlags.Public);varlogEntries=newSortedDictionary();foreach(属性中的var属性){varname=property.Name;varvalue=property.GetValue(exception,null).ToString();logEntries.Add(名称,值);}foreach(varentryinlogEntries){builder.AppendFormat("{0}:{1}",entry.Key,entry.Value);}base.Append(builder,logEvent);这会将在异常类型上声明的每个属性按字母顺序添加到日志输出中。我对NLog不熟悉,但是是否可以在try/catch块中捕获异常,然后抛出您自己类型的新异常,覆盖ToString以在新异常类型中输出您关心的数据?这会在某种程度上破坏跟踪,因此您可能必须在ToString输出中包含原始异常的跟踪,但它可能很容易变通。我的另一个想法是扩展和覆盖SocketException的ToString,但我认为这在C#中是不可能的。序列化异常并记录结果流?以上就是C#学习教程:记录异常属性分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: