【问题标题】:How to map a thrown exception to an event ID for logging?如何将抛出的异常映射到事件 ID 以进行日志记录?
【发布时间】:2014-05-28 20:32:33
【问题描述】:

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

当检测到错误并引发异常时,我们可以获得有关错误情况的最多信息,我想使用将记录在 Windows 事件日志中的唯一事件 ID 来识别错误。

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

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

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

大家有什么好的意见或建议吗?

【问题讨论】:

    标签: c# .net windows exception-handling


    【解决方案1】:

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

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

    【讨论】:

    • “而任何异常都可能有 HResult”是一个非常有用的评论。我可能不想为此依赖使用 HResult 属性,因为它可能不是我的代码引发了异常。一些底层 COM/Win32 子系统可能会引发异常,而盲目地将 Exception.HResults 映射到 eventId 是愚蠢的,因为它可能不是我的代码产生的异常。
    • 我更新了任何自定义异常类以在构造函数中包含 EventID int 参数。然后在创建这些异常时,我将 EventID 添加到带有键“EventID”的 Exception.Data 字典中。我还更新了标准异常的抛出方式,如下所示: if (String.IsNullOrEmpty(credentials.Password)) { ArgumentException ex = new ArgumentException("必须提供用户密码。", "credentials"); ex.Data.Add("EventID", EventConstants.PasswordIsNullOrEmpty);扔前; }
    猜你喜欢
    • 2014-03-31
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2020-12-09
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多