使用c#中的事件处理程序进行顶级异常处理

时间:2009-05-13 11:32:24

标签: c# exception events asynchronous

我目前正在问自己一些关于异常处理和事件处理程序的问题,我希望你们中的一些人会给我一些帮助。

我将开始解释我想在c#应用程序中实现的目标:

我有一个顶级方法(让我们称之为main方法)。此方法调用异步方法(称为connect),该方法连接到FTP服务器。

EventHandler对象与此连接相关联,并且在连接成功时调用“callback”方法。

我想处理可在整个过程中启动的异常。所以我想在顶级方法中捕获它。它适用于connect方法启动的异常(在顶级方法中调用)。 但是,它不适用于在“回调”方法中调用的异常:顶级方法不会捕获它们并且执行失败。

我可以做些什么来使顶级方法捕获这些异常?我不想在回调中处理这些异常。

5 个答案:

答案 0 :(得分:2)

看看Backgroundworker如何处理这个:Exception传播到Completed事件处理程序。

我假设您有某种形式的State对象传递给委托/从委托传递,您可以在这里添加这样的属性。而且你必须在最外层的范围内捕获线程中的所有异常。但“处理”只意味着传递它。

RunWorkerCompleted事件有一个标准模式,请参阅this MSDN page

答案 1 :(得分:2)

考虑以下代码片段,将所有代码包装在全局异常处理程序中:

namespace MyClient
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        bool isSuccess = SubMain(string[] args);
      }
      catch (Exception e)
      {
        HandleExceptionGracefully(e);
      }
    }
    static bool SubMain(string[] agrs)
    {
       // Do something
    }
    static void HandleExceptionGracefully(Exception e)
    {
       // Display/Send the exception in a graceful manner to the user/admin.
    }
  }
}

另外,不要忘记进行错误处理user-friendly.

答案 2 :(得分:1)

Application类中有一个名为ThreadException的事件处理程序。每当抛出一个未在当前调用堆栈中的任何位置捕获的异常时,将触发此事件。


编辑:

抱歉,我误解了这个问题 - 我没有意识到您示例中的“主要”方法不是实际的 方法。在这种情况下,您可能希望在回调中捕获异常,但不处理它 - 而只是将其作为事件args的一部分传递回main方法。

Winforms中的BackgroundWorker做了类似的事情。

答案 3 :(得分:0)

感谢您的回答。

似乎使用BackgroundWorker解决了这个问题。

我没有尝试过,因为我选择避免这种实施负担。所以我拿走了我的异步调用并使我的应用程序同步运行。

使用Compact Framework而不是完整.NET Framework的人员的一个提示: BackgroundWorker在CF中不可用,但OpenNETCF提供了类似的解决方案(请参阅智能设备框架中的BackgroundWorker类)。

答案 4 :(得分:0)

处理顶级异常处理问题的一种更方便的方法是使用委托。

这些c#委托允许以异步方式调用方法。代表也允许顶级异常处理。实际上,在委托中抛出的异常会被重新抛出原始线程。

我不知道为什么我以前没有考虑过代表。 我希望它会有所帮助。

请参阅这些关于代表的好文章:

Article 1

Article 2