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