HoRain云--Dart异常处理全攻略:从入门到精通
HoRain云小助手个人主页 个人专栏: 《Linux 系列教程》《c语言教程》⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。专栏介绍专栏名称专栏介绍《C语言》本专栏主要撰写C干货内容和编程技巧让大家从底层了解C把更多的知识由抽象到简单通俗易懂。《网络协议》本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘一起解密网络协议在运行中协议的基本运行机制《docker容器精解篇》全面深入解析 docker 容器从基础到进阶涵盖原理、操作、实践案例助您精通 docker。《linux系列》本专栏主要撰写Linux干货内容从基础到进阶知识由抽象到简单通俗易懂帮你从新手小白到扫地僧。《python 系列》本专栏着重撰写Python相关的干货内容与编程技巧助力大家从底层去认识Python将更多复杂的知识由抽象转化为简单易懂的内容。《试题库》本专栏主要是发布一些考试和练习题库涵盖软考、HCIE、HRCE、CCNA等目录⛳️ 推荐专栏介绍抛出与捕获基础多个 catch 子句自上而下匹配finally无论成败都执行rethrow保留原始堆栈的再抛出自定义异常与 Error 的区分异步代码中的异常处理Dart 2.16 推荐Error.throwWithStackTrace一个完整的处理范式Dart 的异常处理围绕throw—try—catch—finally​ 这套结构化机制展开。Dart 中任何非 null 对象都可以被抛出——不仅限于ExceptionError乃至普通对象都能 throwthrow本身是个表达式所以可以直接写在函数体里void distanceTo(Point other) throw UnimplementedError();。下面按抛出 → 捕获 → 清理 → 重抛/包装的顺序过一遍。抛出与捕获基础try { breedMoreLlamas(); } on OutOfLlamasException { // 只关心类型不需要异常对象 buyMoreLlamas(); }on和catch可以单独用也可以组合只用on Type只想针对某类异常做处理不需要拿到异常对象只用catch (e)需要异常对象但不关心类型on Type catch (e, s)既要类型匹配又要异常对象和堆栈catch的第二个参数s是StackTrace对象排查线上问题非常关键。多个 catch 子句自上而下匹配Dart 允许多个on/catch子句第一个匹配到类型的子句生效后续忽略。所以具体类型要写在前面宽泛的写在后面try { breedMoreLlamas(); } on OutOfLlamasException { // 特定异常优先处理 buyMoreLlamas(); } on Exception catch (e) { // 其他 Exception print(Unknown exception: $e); } catch (e) { // 没有指定类型 兜底能捕获一切包括 Error print(Something really unknown: $e); }⚠️ 兜底catch (e)会连Error一起吞掉。Effective Dart 明确建议大多数情况下应该捕获Exception而不是所有类型Exception是所有运行时异常的基类它排除了代表代码 bug 的Error。finally无论成败都执行资源清理、状态复位等必须跑的逻辑放在finallytry { breedMoreLlamas(); } catch (e) { print(Error: $e); // 先处理异常 } finally { cleanLlamaStalls(); // 再清理 }如果try中没有catch匹配到异常finally执行完后异常会继续向上传播。rethrow保留原始堆栈的再抛出这是 Dart 异常处理里最容易被误用的一点。看两段代码的区别// ❌ 错误示范throw e 会重置堆栈到当前位置 try { somethingRisky(); } catch (e) { if (!canHandle(e)) throw e; // 堆栈从这里重新开始 handle(e); } // ✅ 正确做法rethrow 保留原始堆栈 try { somethingRisky(); } catch (e) { if (!canHandle(e)) rethrow; // 堆栈信息完整保留 handle(e); }rethrow只能在catch块内使用它会把异常原封不动含原始堆栈继续向上抛。Effective Dart 专门有一条 lint 规则use_rethrow_when_possible来强制这一点。自定义异常与 Error 的区分Dart 里有两个重要的基类语义不同类型用途示例Exception运行时失败不代表代码 bug​FormatException、IOExceptionError程序错误意味着代码有 bugArgumentError、StateError、OutOfMemoryError指导原则你的 API 想报告调用方用错了 → 抛Error子类如ArgumentError运行时失败、不代表 bug → 抛Exception或其子类不要​catch具体的Error类型lint 规则avoid_catching_errors因为Error应该一路冒泡直到终止程序并打印堆栈让你定位修复 bug捕获它会掩盖问题自定义异常很简单实现Exception接口即可class OutOfLlamasException implements Exception { final String message; OutOfLlamasException(this.message); override String toString() OutOfLlamasException: $message; }异步代码中的异常处理try-catch在async函数中对同步和异步代码同样有效直接await可能抛出的异步操作即可Future describeFlybyObjects(List flybyObjects) async { try { for (final object in flybyObjects) { var description await File($object.txt).readAsString(); print(description); } } on IOException catch (e) { print(Could not describe object: $e); } finally { flybyObjects.clear(); } }如果是即发即弃的Future且你确实不在乎成功与否可以调用.ignore()FirebaseAnalytics.instance.logAppOpen().ignore();Dart 2.16 推荐Error.throwWithStackTrace有时候你需要在catch块里抛出一个新的异常比如把底层异常包装成业务异常但又不想丢失原始堆栈。这时候直接用throw NewException()会丢失原堆栈——Dart 2.16 引入的Error.throwWithStackTrace就是为解决这个问题try { final json await client.get(id); return Item.fromJson(json); } on Object catch (_, stackTrace) { Error.throwWithStackTrace( ApiException(Something goes wrong), stackTrace, ); }它的作用是带着原始的stackTrace​ 抛出新的错误。如果error继承自Error且之前未被抛出过其Error.stackTrace属性会被设为传入的stackTrace。相应的DCM 等静态分析工具提供了avoid_throw_in_catch_block规则专门警告在 catch 块内直接throw会丢失原堆栈的反模式。 简单记想原样继续抛 →rethrow想换成新异常但保留原堆栈 →Error.throwWithStackTrace。一个完整的处理范式综合上面所有要点这是 Dart 中处理异常的标准范式FutureItem fetchItem(String id) async { try { final json await client.get(id); return Item.fromJson(json); } on FormatException { // 可预见的、可恢复的异常 → 返回默认值或特殊标记 return const Item.empty(); } on TimeoutException catch (e, s) { // 可预见但需要包装的异常 → 保留堆栈 Error.throwWithStackTrace(ApiException(请求超时), s); } catch (e, s) { // 兜底记录日志后继续向上抛绝不静默吞掉 log.error(fetchItem failed: $e, stackTrace: s); rethrow; } finally { client.close(); } }几个必须遵守的实践准则绝不静默丢弃异常——on Object { return null; }是最糟糕的写法丢失堆栈后在 Crashlytics/Sentry 里几乎无法定位问题优先捕获具体类型不要用裸catch (e)一把梭不要捕获具体的Error子类让 bug 类错误自然冒泡重新抛出用rethrow包装异常用Error.throwWithStackTrace全局异步异常可以用runZonedGuarded兜住runZonedGuarded(() async { longAsyncOperation(); runApp(App()); }, (error, stackTrace) /* 上报 */);异常处理看似简单但在 Dart 里堆栈信息的保留是核心痛点——throw和rethrow一字之差线上排查难度天差地别。把rethrow和Error.throwWithStackTrace这两个工具用熟你的错误处理就达到了 Dart 社区的生产级标准。需要我再展开讲讲Future与Stream的异常处理差异还是Result类型函数式错误处理的替代方案❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧

相关新闻

STM32硬件SPI驱动三线SPI-LCD:协议解析与DMA优化实践

STM32硬件SPI驱动三线SPI-LCD:协议解析与DMA优化实践

1. 从三线SPI-LCD的“非主流”说起如果你玩过STM32驱动LCD,大概率用过8080并口或者标准的4线SPI。前者速度快但占引脚多,后者协议简单但也要4根线(SCK, MOSI, MISO, CS)。但最近在一些追求极致成本或特定封装的小尺寸LCD模块上&am…

2026/7/30 12:17:51 阅读更多 →
基于启发式搜索的最优路径规划算法研究7

基于启发式搜索的最优路径规划算法研究7

引言路径规划问题的背景与重要性启发式搜索在路径规划中的核心作用研究目标与文章结构概述路径规划问题定义路径规划的数学建模(图论与状态空间表示)最优路径的评估标准(如最短距离、最少时间、最低成本)常见应用场景(…

2026/7/30 12:17:51 阅读更多 →
Python在芯片健康评估中的实战应用

Python在芯片健康评估中的实战应用

1. 芯片健康评估:为什么需要Python这把"手术刀"在半导体行业摸爬滚打十几年,我见过太多工程师面对芯片异常时的手足无措。去年有个典型案例:某工业控制器批量出现间歇性死机,厂商更换了所有外围元件仍无法解决&#xff…

2026/7/30 12:17:51 阅读更多 →

最新新闻

深入解析CAN总线:从核心原理到STM32实战应用

深入解析CAN总线:从核心原理到STM32实战应用

1. 项目概述:从“线”到“网络”的认知跃迁提到CAN总线,很多刚接触汽车电子或工业控制的朋友,第一反应可能就是“车上的一根通讯线”。这个理解对,但也不全对。它确实是一根线(准确说是两根差分线)&#xf…

2026/7/30 12:25:54 阅读更多 →
使用RenderDoc逆向分析Unreal Engine延迟渲染管线

使用RenderDoc逆向分析Unreal Engine延迟渲染管线

1. 项目概述:为什么我们要“拆解”延迟渲染管线?在游戏开发或者图形学学习的路上,你肯定不止一次听过“延迟渲染”这个词。它几乎是现代3A游戏和高质量实时渲染项目的标配管线。但很多时候,我们学习它,仅仅停留在理论层…

2026/7/30 12:25:54 阅读更多 →
LeaferJS实现浏览器端动态贴纸系统技术解析

LeaferJS实现浏览器端动态贴纸系统技术解析

1. 视频混剪与贴纸系统的技术融合在短视频内容爆发的时代,视频混剪已经成为内容创作者的基础技能。而贴纸系统作为增强视频表现力的重要手段,能够为作品添加个性化元素和品牌标识。传统实现方式往往依赖AE等专业软件,但LeaferJS这个轻量级Can…

2026/7/30 12:25:54 阅读更多 →
【单片机课程设计/毕业设计】基于 STM32F103 的火焰异常监测与联动设备控制系统开发 基于嵌入式单片机的消防预警硬件联动装置设计(012601)

【单片机课程设计/毕业设计】基于 STM32F103 的火焰异常监测与联动设备控制系统开发 基于嵌入式单片机的消防预警硬件联动装置设计(012601)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/7/30 12:25:54 阅读更多 →
2026年8月助行器厂家靠谱推荐@长期合作衡水喜乐点助行器

2026年8月助行器厂家靠谱推荐@长期合作衡水喜乐点助行器

每到年中,总有不少养老院、社区诊所、康复中心的采购负责人开始头疼:市面上的助行器厂家五花八门,价格从几十到上千不等,参数吹得天花乱坠,可真正到手后,不是防滑胶垫遇水打滑,就是高度卡扣用几…

2026/7/30 12:25:54 阅读更多 →
TabPFN技术深度解析:基于Transformer的表格数据基础模型架构与实战应用

TabPFN技术深度解析:基于Transformer的表格数据基础模型架构与实战应用

TabPFN技术深度解析:基于Transformer的表格数据基础模型架构与实战应用 【免费下载链接】TabPFN ⚡ TabPFN: Foundation Model for Tabular Data ⚡ 项目地址: https://gitcode.com/GitHub_Trending/ta/TabPFN TabPFN是一个革命性的表格数据基础模型&#xf…

2026/7/30 12:24:54 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻