gpt4 book ai didi

c# - ContinueWith 没有捕获到异常?

转载 作者:太空狗 更新时间:2023-10-30 01:16:36 26 4
gpt4 key购买 nike

使用 Visual Studio 2015,针对 FW 4(在 FW 4 下测试不可观察的异常):

enter image description here

我期待这段代码:

static void Main(string[] args)
{

try
{
Task.Factory.StartNew(() => Console.WriteLine(1))
.ContinueWith(t => Thread.Sleep(1000))
.ContinueWith(t => Console.WriteLine(2))
.ContinueWith(t => Thread.Sleep(1000))
.ContinueWith(t => { throw new Exception("aaaa"); })
.ContinueWith(t => Console.WriteLine(3));
}
catch (Exception ex)
{
Console.WriteLine(ex);

}
GC.Collect();
GC.Collect();
Console.ReadLine();
}

向我展示异常情况。

我知道我可以通过 T.Wait() 或在最后一个任务中使用 t.Exception 看到它 - 但为什么我在这里看不到异常?

我知道异常处理机制在 4.5 中改变了,为了获得旧机制我应该添加:

 <ThrowUnobservedTaskExceptions enabled="true"/>

我做了什么:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
</configuration>

但是结果还是:

enter image description here

问题:

为什么我看不到异常?

值得一提的是,我确实在 Debug模式下看到了异常:

enter image description here

最佳答案

您不能指望这段代码会抛出异常,因为 try 子句中的语句所做的只是描述一个延续模式。 StartNewContinueWith 方法不会抛出异常。所以代码执行早就在后台任务抛出异常时留下了这个try语句。当程序启动后大约 2 秒后抛出异常时,执行将在 Console.Readline 语句上停止。

正如您已经发现的那样,您需要等待任务完成才能访问异常或在延续本身内部。

现在,您的应用程序不会因未观察到的异常而死掉的原因是因为没有发生垃圾收集。当任务被垃圾收集时,未观察到的异常将拆除您的应用程序域。但是当你强制 GC 时,异常还没有被抛出,任务也没有完成,所以它不符合垃圾收集的条件。

确保将 GC.Collect 调用放在 Console.ReadLine 方法之后,然后是另一个 Console.ReadLine :

Task.Factory.StartNew(() => Console.WriteLine(1))
.ContinueWith(t => Thread.Sleep(1000))
.ContinueWith(t => Console.WriteLine(2))
.ContinueWith(t => Thread.Sleep(1000))
.ContinueWith(t => { throw new Exception("aaaa"); })
.ContinueWith(t => Console.WriteLine(3));

Console.ReadLine();
GC.Collect();
GC.Collect();
Console.ReadLine();

显然应该存在以下配置开关:

<ThrowUnobservedTaskExceptions enabled="true"/>

关于c# - ContinueWith 没有捕获到异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34695447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com