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

本文关键字:catch try 语句 捕获异常 异步操作 异常 | 更新日期: 2023-09-27 18:11:53

例如:

第一步:绑定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事件,结束事件调用后再退出应用程序。

我想在catch语句中捕获任何异常,并避免退出应用程序。

=======================================================

异步代码是异步套接字操作。在套接字异步接收消息事件(BeginReceive,EndReceive)中,抛出OverFlowException。

throw new OverflowException("chunk size too long.");

=============================================

你是对的,现在我在异步操作中捕获异常并将其传递给原始类(这意味着异常将在同一线程上抛出,可以尝试…

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

默认情况下,异步任务将在与其实例化时不同的上下文中运行。因此,try/catch块在这种情况下是无效的。

用下面的方法思考。

Worker worker = new HouseMaid();
try
{
    worker.DoSomeWork();
}
catch(WorkerIsSickException ex)
{
    worker.TakeMedicin();
    worker.StopWorkingAndRestForAWhile();
}

这里我们看到,当worker生病时,工作进程中断,异常将被处理。然而,当我们这样做时:

Worker worker = new HouseMaid();
try
{
    Worker otherWorker = new HouseMaidHelper();
    worker.DelegateWorkTo(otherWorker, CallBackWhenOTherWorkerIsDone);
    worker.GoOnDoSomethingElse();
}
catch(WorkerIsSickException ex)
{
    worker.TakeMedicin();
    worker.StopWorkingAndRestForAWhile();
}

work try/catch块(或者安全网,如果你愿意的话)只适用于worker,而不适用于otherWorker。otherWorker有自己的工作范围。如果另一个工人失败了,这并不意味着他必须吃药。

你的问题不清楚,但如果是异步操作抛出异常,那么你所展示的代码可以很容易地在异常被抛出之前完成-它都是异步的,对吗?

基本上异步会让你重新思考错误处理——如何处理取决于你的异步方法。您通常会在回调中捕获异常-或者甚至不捕获它,但是使用Task.Status之类的东西检查它。

不可否认,c# 5中针对异步的所有工作应该会使这些工作变得更容易,但是您仍然需要考虑异步。

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