在C#异步编程中,任务延续(Task Continuation) 是处理异步操作完成后的逻辑的重要机制。然而,当任务抛出异常时,如何优雅地捕获并处理这些异常?这就需要用到 异常过滤(Exception Filtering) 技术。本文将从零开始,手把手教你如何在 C# 中使用任务延续配合异常过滤,实现健壮的异步错误处理。

在 C# 中,Task 表示一个异步操作。你可以通过 .ContinueWith() 方法为任务注册一个“延续”——即当前任务完成后自动执行的回调方法。
例如:
var task = Task.Run(() =>{ Console.WriteLine("正在执行任务..."); return 42;});task.ContinueWith(t =>{ Console.WriteLine($"任务结果: {t.Result}");});如果任务内部抛出异常,该异常会被封装在 AggregateException 中,并导致任务状态变为 Faulted。如果你不处理它,程序可能在稍后访问 .Result 或调用 .Wait() 时崩溃。
例如:
var faultedTask = Task.Run(() =>{ throw new InvalidOperationException("模拟异常!");});// 如果不处理,下面这行会抛出 AggregateException// var result = faultedTask.Result;好消息是,.ContinueWith() 支持通过 TaskContinuationOptions 参数来指定只在特定条件下执行延续。比如,我们可以通过 OnlyOnFaulted 选项,让延续仅在任务失败(抛出异常)时运行。
更重要的是,你可以在延续中检查异常类型,实现 异常过滤,这是 C# 异步编程中的高级技巧之一。
var riskyTask = Task.Run(() =>{ // 模拟可能抛出不同异常的操作 var random = new Random(); int value = random.Next(0, 3); if (value == 0) throw new FileNotFoundException("文件未找到"); else if (value == 1) throw new TimeoutException("操作超时"); else throw new InvalidOperationException("无效操作");});// 仅在任务失败时执行延续riskyTask.ContinueWith(t =>{ if (t.Exception?.InnerException is FileNotFoundException) { Console.WriteLine("【异常过滤】捕获到文件未找到异常,尝试备用路径..."); } else if (t.Exception?.InnerException is TimeoutException) { Console.WriteLine("【异常过滤】捕获到超时异常,准备重试..."); } else { Console.WriteLine($"【异常过滤】其他异常: {t.Exception?.InnerException?.Message}"); }}, TaskContinuationOptions.OnlyOnFaulted);// 等待任务完成(避免主线程退出)await riskyTask;在这个例子中,我们利用 OnlyOnFaulted 确保延续只在任务失败时运行,然后通过检查 t.Exception.InnerException 的实际类型,实现对不同异常的差异化处理——这就是 C#任务延续中的异常过滤。
在复杂的异步系统中,不同类型的异常可能需要不同的恢复策略:
通过异常过滤,你可以避免“一刀切”的异常处理方式,提升程序的健壮性和用户体验。
ContinueWith 功能强大,但在大多数场景下,try-catch 配合 await 更简洁易读。通过本文,你已经掌握了 C#任务延续 与 异常过滤 的核心用法。合理运用 ContinueWith 和 TaskContinuationOptions.OnlyOnFaulted,可以让你的 C#异步编程 更加安全、灵活。记住,良好的 Task异常处理 是构建高可用系统的关键一步!
现在就去优化你的异步代码吧!
本文由主机测评网于2025-12-15发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025128056.html