5

我是软件开发的新手,也是 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 框架,还是有其他方法可以捕获这些异常?

4

3 回答 3

2

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

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

于 2011-07-27T19:33:43.703 回答
1

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

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

正如您所说,我已将它们用于异常日志记录和性能日志记录......除此之外,您还使用拦截器进行类似事务。

于 2011-07-27T19:33:22.737 回答
1

您可以考虑使用 Spring.NET 或 Unity 之类的 AOP 框架,或者查看 PostSharp 之类的产品(尽管我从未亲自尝试过 PostSharp)。

于 2011-07-27T20:15:24.587 回答