gpt4 book ai didi

c# - 任务和异常静默

转载 作者:可可西里 更新时间:2023-11-01 02:59:30 25 4
gpt4 key购买 nike

为什么任务中抛出的异常是静默异常,你永远不知道某个异常是否已经抛出

try
{

Task task = new Task(
() => {
throw null;
}
);
task.Start();
}
catch
{
Console.WriteLine("Exception");
}

程序在一片寂静中成功运行!线程行为不同的地方

try
{

Thread thread = new Thread(
() => {
throw null;
}
);
thread .Start();
}
catch
{
Console.WriteLine("Exception");
}

这种情况会抛出空指针异常。有什么区别?

最佳答案

该场景的行为取决于您拥有的框架;在 4.0 中,您实际上需要小心 - 如果您不处理 TaskScheduler.UnobservedTaskException,它会在收集/完成时稍后出错,并且会杀死你的进程

TaskScheduler.UnobservedTaskException += (sender, args) =>
{
Trace.WriteLine(args.Exception.Message); // somebody forgot to check!
args.SetObserved();
};

这在 IIRC 4.5 中发生了变化。

要检查 Task 可能 失败的结果,您可以注册一个延续 - 即调用 ContinueWith 并检查结果的异常。或者,访问任务的 .Result(也将执行隐式 Wait())将重新显示发生的异常。最好观察任务的结果,因为它会清除终结标志,这意味着可以更便宜地收集它。

关于c# - 任务和异常静默,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8803107/

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