核心内容摘要
寻找失落的纯真:走进“小处雏女1-30部”的唯美情感世界
网罗开发小红书、快手、视频号同名大家好我是展菲目前在上市企业从事人工智能项目研发管理工作平时热衷于分享各种编程领域的软硬技能知识以及前沿技术包括iOS、前端、Harmony OS、Java、Python等方向。
在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者《ESP32-C3 物联网工程开发实战》图书作者《SwiftUI 入门进阶与实战》超级个体COC上海社区主理人特约讲师大学讲师谷歌亚马逊分享嘉宾科技博主华为HDE/HDG我的博客内容涵盖广泛主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。
我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告同时也会提供产品优缺点分析、横向对比并分享技术沙龙与行业大会的参会体验。
我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲您的前沿技术领航员 大家好我是展菲 全网搜索“展菲”即可纵览我在各大平台的知识足迹。
公众号“Swift社区”每周定时推送干货满满的技术长文从新兴框架的剖析到运维实战的复盘助您技术进阶之路畅通无阻。
微信端添加好友“fzhanfei”与我直接交流不管是项目瓶颈的求助还是行业趋势的探讨随时畅所欲言。
最新动态2025 年 3 月 17 日快来加入技术社区一起挖掘技术的无限潜能携手迈向数字化新征程文章目录前言Error 和 Exception 的基本概念两者的核心区别严重程度不同处理方式不同来源不同实际应用场景场景一内存溢出场景二文件读取失败场景三网络请求超时场景四空指针引用不同语言中的实现最佳实践
总结前言最近在代码审查的时候发现团队里有些小伙伴对 Error 和 Exception 的概念有点混淆。
有人把所有的异常都叫 Exception也有人把系统错误叫 Error但具体什么时候用哪个好像也不是很清楚。
其实这个问题在很多编程语言中都存在比如 Java、Python、Swift 等。
虽然不同语言的具体实现可能不太一样但 Error 和 Exception 的本质区别是相通的。
今天我们就来聊聊 Error 和 Exception 到底有什么区别以及在实际开发中应该如何正确使用它们。
Error 和 Exception 的基本概念在开始之前我们先来理解一下这两个概念的基本含义。
**Error错误**通常指的是系统级的错误这些错误往往是程序无法恢复的或者恢复起来非常困难。
比如内存溢出、栈溢出、系统资源耗尽等。
这些错误一般不是由程序逻辑问题引起的而是由系统环境、硬件资源等外部因素导致的。
**Exception异常**则是指程序运行过程中出现的异常情况这些异常通常是可以被程序捕获和处理的。
比如数组越界、空指针引用、文件不存在、网络连接失败等。
这些异常往往是由程序的设计问题、逻辑错误或者外部输入导致的。
简单来说Error 是系统说不行Exception 是程序说有问题。
两者的核心区别虽然 Error 和 Exception 都是程序运行时的异常情况但它们有几个关键的区别严重程度不同Error 通常比 Exception 更严重。
Error 往往意味着系统级别的故障比如内存溢出OutOfMemoryError、栈溢出StackOverflowError等。
这些错误一旦发生程序通常无法继续正常运行甚至可能导致整个应用崩溃。
Exception 相对来说就没那么严重了。
虽然有些 Exception 也会导致程序崩溃比如未捕获的运行时异常但大多数 Exception 都是可以被程序捕获和处理的。
比如文件读取失败我们可以提示用户重新选择文件网络请求失败我们可以重试或者显示错误信息。
处理方式不同对于 Error我们通常不应该尝试捕获和处理。
因为 Error 往往意味着系统资源已经耗尽或者系统环境出现了严重问题这时候程序已经无法正常工作了强行处理可能会让问题变得更糟。
对于 Exception我们应该主动捕获和处理。
这是程序健壮性的重要体现。
比如在读取文件时我们应该捕获 IOException然后给用户一个友好的提示而不是让程序直接崩溃。
来源不同Error 通常来自系统层面比如 JVM 运行时错误、操作系统错误等。
这些错误不是由我们的业务代码直接引起的而是由底层系统或环境问题导致的。
Exception 通常来自应用层面比如我们的业务逻辑、API 调用、数据处理等。
这些异常往往可以通过改进代码逻辑、添加校验、重试机制等方式来处理。
实际应用场景让我们通过几个实际的场景来理解 Error 和 Exception 的区别场景一内存溢出假设你正在开发一个图片处理应用用户上传了一张非常大的图片。
如果你的程序试图将整个图片加载到内存中而系统内存不足就会抛出 OutOfMemoryError。
这是一个典型的 Error。
因为内存不足是系统资源问题不是你的程序逻辑问题。
虽然你可以通过优化代码比如分块处理图片来避免这个问题但一旦内存真的耗尽了程序就很难恢复了。
正确的做法是在程序设计阶段就考虑内存限制避免一次性加载过大的数据。
如果真的遇到了 OutOfMemoryError最好的处理方式可能是记录错误日志然后优雅地退出程序而不是试图捕获和处理这个错误。
场景二文件读取失败假设你的应用需要读取一个配置文件。
如果文件不存在或者文件被其他程序占用就会抛出 FileNotFoundException 或 IOException。
这是一个典型的 Exception。
因为文件读取失败是可以通过程序逻辑来处理的。
你可以捕获这个异常然后给用户一个友好的提示比如配置文件不存在请检查文件路径或者使用默认配置。
try{FileconfigFilenewFile(config.properties);// 读取配置文件}catch(FileNotFoundExceptione){// 文件不存在使用默认配置logger.warn(配置文件不存在使用默认配置);loadDefaultConfig();}catch(IOExceptione){// 文件读取失败提示用户logger.error(读取配置文件失败,e);showErrorDialog(无法读取配置文件请检查文件权限);}场景三网络请求超时假设你的应用需要调用一个远程 API。
如果网络连接不稳定或者服务器响应慢可能会抛出 SocketTimeoutException 或 ConnectException。
这也是一个典型的 Exception。
你可以捕获这个异常然后实现重试机制或者给用户一个友好的提示。
intmaxRetries3;for(inti0;imaxRetries;i){try{// 发送网络请求returnhttpClient.execute(request);}catch(SocketTimeoutExceptione){if(imaxRetries-
{// 最后一次重试也失败了thrownewApiException(网络请求超时请检查网络连接);}// 等待一段时间后重试Thread.sleep(1000*(i
);}}场景四空指针引用假设你的代码中有一个对象可能为 null但你没有做空值检查就直接使用了它就会抛出 NullPointerException。
这也是一个典型的 Exception。
虽然 NullPointerException 是运行时异常不需要强制捕获但我们应该在代码中主动避免这种情况。
// 不好的做法Stringnameuser.getName();// 如果 user 为 null会抛出 NullPointerExceptionSystem.out.println(name.length());// 好的做法if(user!null){Stringnameuser.getName();if(name!null){System.out.println(name.length());}}不同语言中的实现虽然 Error 和 Exception 的概念是相通的但不同语言的实现方式可能不太一样Java中Error 和 Exception 都是 Throwable 的子类。
Error 包括 OutOfMemoryError、StackOverflowError 等系统级错误Exception 包括 RuntimeException运行时异常和 CheckedException检查异常。
Python中所有的异常都继承自 BaseException。
系统退出异常SystemExit、KeyboardInterrupt类似于 Error其他异常类似于 Exception。
Swift中Error 是一个协议任何遵循 Error 协议的类型都可以被抛出。
Swift 没有严格区分 Error 和 Exception但我们可以通过命名和文档来区分系统级错误和应用级异常。
最佳实践在实际开发中我们应该遵循以下原则对于 Error系统级错误不要尝试捕获和处理系统级错误在程序设计阶段就考虑资源限制避免触发系统错误如果真的遇到了系统错误记录日志并优雅退出对于 Exception应用级异常主动捕获和处理可能出现的异常给用户提供友好的错误提示实现重试机制、降级方案等容错处理记录详细的异常日志方便问题排查代码设计建议使用防御性编程提前检查可能的问题合理使用异常处理不要过度捕获异常区分可恢复的异常和不可恢复的异常对于关键操作实现重试和降级机制