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

Joe*_*ung 5 c# multithreading class-library com-interop unhandled-exception

我是软件开发的新手,也是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助.

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

Eri*_* J. 2

如果您的库入口点集有限,请考虑按照您的建议进行操作 - 使用 .NET 包装器类或包装器库来执行实际的互操作并捕获/记录该包装器类中的异常。返回调用 VB6 库知道如何处理的异常或错误代码(是否重新引发异常取决于 VB6 代码可以处理的内容)。

CrazyDart 建议 IOC,这是一个有趣且有效的替代方案,但最初也增加了复杂性和学习曲线。当然也可以看看国际奥委会并认为这是一种可能性。