繁体   English   中英

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

[英]top-level exception handling with event handlers in c#

我目前正在问自己一些有关异常处理和事件处理程序的问题,希望大家能对我有所帮助。

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

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

EventHandler对象与此连接相关联,连接成功后将调用“回调”方法。

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

我该怎么做才能使这些异常被顶级方法捕获? 我不想在回调中处理这些异常。

看一下Backgroundworker的处理方式:异常传播到Completed事件处理程序。

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

RunWorkerCompleted事件有一个标准模式,请参见此MSDN页面

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

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.
    }
  }
}

另外,不要忘记让您的错误处理变得用户友好。

Application类中有一个名为ThreadException的事件处理程序。 每当在当前调用堆栈中的任何地方引发未捕获的异常时,都会触发此事件。


编辑:

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

Winforms中的BackgroundWorker做类似的事情。

感谢您的回答。

看来使用BackgroundWorker可以解决此问题。

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

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

解决此顶级异常处理问题的更便捷方法是使用委托。

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

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

请参阅有关代理的这些不错的文章:

第1条

第二条

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM