c# – 使用ContinueWith()时如何获取原始异常?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用ContinueWith()时如何获取原始异常?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1986字,纯文字阅读大概需要3分钟。
内容图文
![c# – 使用ContinueWith()时如何获取原始异常?](/upload/InfoBanner/zyjiaocheng/810/a5c6ee79deb84f7da5f03d52d33e48e7.jpg)
请考虑以下代码:
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Demo
{
static class Program
{
static void Main()
{
var tasks = new Task[1];
tasks[0] = Task.Run(() => throwExceptionAfterOneSecond())
.ContinueWith(task => {
Console.WriteLine("ContinueWith()"); }, TaskContinuationOptions.NotOnFaulted);
try
{
Task.WaitAll(tasks);
}
catch (AggregateException ex)
{
Console.WriteLine("Exception received: " + ex.InnerExceptions.Single().Message);
}
}
static void throwExceptionAfterOneSecond()
{
Thread.Sleep(1000);
throw new InvalidOperationException("TEST");
}
}
}
这会产生以下输出:
收到例外:任务被取消.
我的问题很简单:如何获得原始的InvalidOperationException(“TEST”);而不是System.Threading.Tasks.TaskCanceledException?
请注意,如果删除.ContinueWith()部分,这将按预期工作,在这种情况下输出为Exception received:TEST.
(另请注意,此示例使用.Net 4.5,但原始代码必须使用.Net 4.0)
解
感谢答案,现在正在运作.我选择了以下解决方案 – 我需要等待原始任务和继续任务:
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Demo
{
static class Program
{
static void Main()
{
var tasks = new Task[2];
tasks[0] = Task.Run(() => throwExceptionAfterOneSecond());
tasks[1] = tasks[0].ContinueWith(task => {
if (task.Status == TaskStatus.RanToCompletion)
Console.WriteLine("ContinueWith()"); });
try
{
Task.WaitAll(tasks);
}
catch (AggregateException ex)
{
Console.WriteLine("Exception received: " + ex.InnerExceptions.Single().Message);
}
Console.WriteLine("Done.");
}
static void throwExceptionAfterOneSecond()
{
Thread.Sleep(1000);
throw new InvalidOperationException("TEST");
}
}
}
解决方法:
您需要存储对Task.Run(()=> throwExceptionAfterOneSecond())的引用,以便稍后可以检查它的Exception属性.这是唯一出错的任务.检查任何其他任务不会提供该异常.
我也不依赖于TaskContinuationOptions.NotOnFaulted,因为这非常强制使用控制流的异常.在没有抛出异常的情况下很难等待非正常完成的任务.
.ContinueWith(task => {
if (task.Status == RanToCompletion) Console.WriteLine("ContinueWith()");
}
内容总结
以上是互联网集市为您收集整理的c# – 使用ContinueWith()时如何获取原始异常?全部内容,希望文章能够帮你解决c# – 使用ContinueWith()时如何获取原始异常?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。