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