例如:
第一步:绑定UnhandledException事件。
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
第二步:
try
{
//at here,do asynchronous operation and throw a exception.
}
catch (Exception ex)
{
Console.WriteLine("error");
}
当异步操作抛出异常时,它没有调用catch代码,只是触发了UnhandledException事件,在调用end event之后再退出应用程序。
我希望在catch语句中捕获异常,并避免退出应用程序。
=============================================== ======
异步代码是异步套接字操作。在套接字异步接收消息事件(BeginReceive,EndReceive)中,我抛出一个OverFlowException。
throw new OverflowException("chunk size too long.");
=============================================
你是对的,现在我在异步操作中捕获异常并将其传递给原始类(这意味着异常将抛出同一个线程,可以尝试...可以调用catcy语句)
答案 0 :(得分:2)
你的问题不明确,但是如果它是抛出异常的异步操作,那么你所展示的代码可能很容易在抛出异常之前完成 - 它都是异步的,对吗?
基本上异步会让您重新考虑错误处理 - 而且您的工作方式取决于您的异步方法。你经常在回调中捕获异常 - 或者甚至 catch 它,但是用Task.Status
之类的东西检查它。
不可否认,C#5中针对异步内容的所有工作都应该使其中的一些变得更容易,但您仍然需要思考关于异步。
答案 1 :(得分:2)
默认情况下,异步任务将在与其实例化的上下文不同的上下文中运行。因此,try / catch块在这种情况下无效。
以下列方式考虑它。
Worker worker = new HouseMaid();
try
{
worker.DoSomeWork();
}
catch(WorkerIsSickException ex)
{
worker.TakeMedicin();
worker.StopWorkingAndRestForAWhile();
}
在这里,我们看到当工人生病时,工作流程中断,异常将被处理。但是,当我们这样做时:
Worker worker = new HouseMaid();
try
{
Worker otherWorker = new HouseMaidHelper();
worker.DelegateWorkTo(otherWorker, CallBackWhenOTherWorkerIsDone);
worker.GoOnDoSomethingElse();
}
catch(WorkerIsSickException ex)
{
worker.TakeMedicin();
worker.StopWorkingAndRestForAWhile();
}
工作try / catch块(或安全网,如果你愿意),只适用于worker,而不适用于otherWorker。 otherWorker有自己的工作范围。如果另一个工人失败,那不应该意味着工人必须服用药物。
答案 2 :(得分:0)
异步操作将成功启动,因此执行将继续成功并错过您的异常处理程序。如果要在异步操作中捕获异常,则需要在异步执行的代码中进行异常处理。然后,如果要在那里处理异常,可以将回调函数放回原始类中的函数。