C# 如何将抛出的异常映射到事件ID以进行日志记录?

C# 如何将抛出的异常映射到事件ID以进行日志记录?,c#,.net,windows,exception-handling,C#,.net,Windows,Exception Handling,在我们的代码库中,错误条件可能导致抛出异常。在代码的其他地方,异常处理程序捕获异常并将错误记录到Windows事件日志中 当检测到错误并引发异常时,我们获得了有关错误条件的最多信息,我想用一个唯一的事件ID标识错误,该ID将记录在windows事件日志中 在抛出的异常中包含此事件ID的最佳方式是什么 我曾考虑过使用,但似乎打算用于COM/win32互操作。人们是否为此目的而使用?似乎可以将严重性映射到日志级别,将设备代码映射到事件源,将Hresult代码映射到事件ID。这是一种常见的方法吗 我考

在我们的代码库中,错误条件可能导致抛出异常。在代码的其他地方,异常处理程序捕获异常并将错误记录到Windows事件日志中

当检测到错误并引发异常时,我们获得了有关错误条件的最多信息,我想用一个唯一的事件ID标识错误,该ID将记录在windows事件日志中

在抛出的异常中包含此事件ID的最佳方式是什么

我曾考虑过使用,但似乎打算用于COM/win32互操作。人们是否为此目的而使用?似乎可以将严重性映射到日志级别,将设备代码映射到事件源,将Hresult代码映射到事件ID。这是一种常见的方法吗

我考虑使用字典并向抛出的异常添加一个命名的“EventID”值,以便我的处理程序可以使用该值记录EventID


有人有什么好的建议吗?

你提到的方法肯定是有效的。我在类似情况下使用的另一种方法是使用提供事件ID的方法或属性使我的异常类型实现特定接口


在所有这些方法中,关键是永远不要吃异常,而是在适当的情况下用更多数据将它们包装在其他异常中,然后在顶层遍历
InnerException
链,直到找到要查找的异常。使用特定接口的优点是,很容易识别以您想要的方式提供信息的异常类,而任何异常都可以有
HResult
exception中的值。Data

“而任何异常都可以有HResult”是非常有用的注释。我可能不想依赖于使用HResult属性,因为引发异常的可能不是我的代码。某些基础COM/Win32子系统可能引发了该异常,如果我盲目地将exception.HResults映射到eventId,那将是愚蠢的,因为我的代码可能不是源于该异常。我更新了所有自定义异常类,以便在构造函数中包含eventId int参数。然后在创建这些异常时,我将EventID添加到Exception.Data字典中,键为“EventID”。我还更新了标准异常的抛出方式,如下所示:if(String.IsNullOrEmpty(credentials.Password)){ArgumentException ex=new ArgumentException(“必须提供用户密码”),“credentials”);ex.Data.Add(“EventID”,EventConstants.PasswordIsNullOrEmpty);throw ex;}