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

时间:2011-07-27 19:29:01

标签: c# multithreading com-interop class-library 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;
    }
}

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

感谢您的帮助。

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

3 个答案:

答案 0 :(得分:2)

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

CrazyDart建议IOC,这是一个有趣且有效的替代方案,但最初也增加了复杂性和学习曲线。当然也要看看IOC,并将其作为一种可能性。

答案 1 :(得分:1)

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

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

我已经将它们用于异常日志记录,正如您所说的那样,以及性能日志记录......在许多其他事情中,您使用拦截器进行类似的事务处理。

答案 2 :(得分:1)

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