在异步操作中发生异常时,c#try ... catch语句不捕获异常

时间:2011-10-20 10:02:48

标签: c# exception

例如:

第一步:绑定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语句)

3 个答案:

答案 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)

异步操作将成功启动,因此执行将继续成功并错过您的异常处理程序。如果要在异步操作中捕获异常,则需要在异步执行的代码中进行异常处理。然后,如果要在那里处理异常,可以将回调函数放回原始类中的函数。