try_catch 是处理运行期异常的核心机制,需 try 与 catch 成对使用,优先捕获具体异常类型,配合 finally 或 try-with-resources 确保资源释放,并严禁忽略异常。

try_catch 是处理运行期异常的核心机制,它让程序在出错时不至于崩溃,而是能按预期逻辑响应、恢复或提示用户。
基本结构:try + catch 必须成对出现
try 块中写可能出错的代码,catch 块负责接收并处理对应类型的异常。没有 try,catch 就无法生效;没有 catch(或 finally),try 单独存在也没有意义。
- 一个 try 可以跟多个 catch,分别捕获不同类型的异常(如 IOException、NullPointerException)
- catch 参数必须是 Throwable 的子类(常见是 Exception 或其子类)
- 如果异常类型不匹配,该 catch 不会执行,异常会继续向上抛出
捕获具体异常比笼统捕获更安全
避免只写 catch(Exception e),它会吞掉所有异常,掩盖真实问题。应优先捕获明确的异常类型。
- 读文件失败?用 catch(FileNotFoundException e)
- 网络请求超时?用 catch(SocketTimeoutException e)
- 数组越界?用 catch(ArrayIndexOutOfBoundsException e)
- 必要时再加一层通用 catch(Exception e) 做兜底,但要记录日志,不能静默忽略
善用 finally 或 try-with-resources 保证资源释放
文件流、数据库连接、网络套接字等资源,必须确保关闭,否则会导致内存泄漏或句柄耗尽。
- finally 块无论是否异常都会执行,适合写 close() 逻辑
- Java 7+ 推荐用 try-with-resources,自动调用 close(),更简洁可靠
- 注意:如果 finally 中也抛异常,会覆盖 try/catch 中的异常(除非显式处理)
不要忽略异常,至少记录或转换再抛出
空的 catch 块(catch(Exception e) { })是严重隐患,等于把错误“藏起来”。
- 记录日志:用 e.printStackTrace()(仅调试)、logger.error("读取配置失败", e)
- 转换异常:将底层异常包装为业务异常,如 throw new BusinessException("支付验证失败", e)
- 向用户反馈:在 UI 层 catch 后弹出友好提示,而非堆栈信息










