c#类库中用于日志记录的未处理异常

本文关键字:未处理 异常 记录 日志 类库 用于 | 更新日期: 2023-09-27 18:03:38

我是软件开发的新手,也是stackoverflow的新手,所以请原谅我。

背景:我正在开发一个c#类库,用于处理第三方应用程序通过tcp/ip(使用异步套接字)发送的xml消息。我正在使用com-interop,以便将类库暴露给Vb6应用程序。当c#库处理它通过套接字接收到的xml时,它会引发消费vb6应用程序订阅的各种事件(这样,当我们最终在。net中重写整个应用程序时,我们已经完成了这个组件)。

问题:我想捕获所有未处理的异常,仅用于日志目的。在winforms应用程序中,你可以将一个事件连接到AppDomain.CurrentDomain.UnhandledException和application . threadexception。是否没有类似地获取异常数据以记录类库中的信息的方法?

重要的几点:

  • 我不是试图从这些异常中恢复,但只是记录它们,让异常传播并在需要时崩溃应用程序。

  • 我正在尽我最大的努力在本地捕获所有特定的异常,无论我知道它们可能发生。因此,我的目的只是记录真正意想不到的异常。

  • 我知道有些人会说这将是一个糟糕的设计模式。我应该让调用者处理这些异常。问题是vb6应用程序没有像我想的那样强大的错误处理。首先,我想记录堆栈跟踪,以便如果vb6应用程序由于我的dll而崩溃,我可以查看日志,以便对可能需要更改的c#代码的潜在区域发出警报。
谁能给我指点一下方向?到目前为止,我发现最好的选择似乎是在每个公共方法中放置一个通用的try catch块,记录异常,然后抛出它。这似乎不太理想:
public void SomeMethod()
{
    try
    {
        // try something here...
    }
    catch (Exception ex)
    {
        Log(ex);
        throw;
    }
}

这不仅看起来像一个糟糕的设计,而且我不知道如果一个异步回调在不同的线程上导致异常会发生什么,而不是调用该方法。这个通用的try/catch块还会捕获这样的异常吗?

谢谢你的帮助。

编辑:我最初标记@Eric J。的答案是正确的,但在尝试实现解决方案后,我发现它不能很好地与我正在使用的套接字类的异步回调一起工作。一旦使用线程池线程来触发异步回调,我似乎无法捕获堆栈中稍后发生的任何异常。我是否需要使用AOP框架,或者是否有其他方法来捕获这些异常?

c#类库中用于日志记录的未处理异常

如果库的入口点有限,请考虑按照您的建议去做——使用。net包装器类或包装器库来执行实际的互操作,并在该包装器类中捕获/记录异常。返回一个异常或错误代码,调用VB6库知道如何处理(是否重新抛出异常取决于VB6代码可以处理什么)。

CrazyDart建议使用IOC,这是一个有趣且有效的选择,但也会增加复杂性和初始学习曲线。当然也要考虑一下IOC,并把它作为一种可能性。

你可以使用Castle Windsor和一个拦截器。这是在项目中使用IOC的好理由。

http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx

我已经将它们用于异常日志,就像你说的,以及性能日志…在许多其他事情中,你使用拦截器来处理事务。

您可以考虑使用像Spring这样的AOP框架。. NET或Unity,或者看看PostSharp这样的产品(尽管我个人从未尝试过PostSharp)。