java - 有什么简单的解释说明修改 Java catch 子句中的异常参数 ex 的充分理由吗?
问题描述
在阅读了 2 个源代码和其他 stackoverflow 线程之后,我仍然不明白为什么异常参数 ex 应该是可修改的(任何罕见的情况都可以作为示例答案),任何人都可以告诉一个好的场景/时间来修改 ex范围?Java语言规范中的含义是什么。说“有效地最终”?
uni-catch 子句意味着只有 1 个异常被捕获?
catch (IOException ex)
与从 JAVE SE 1.7 开始的多捕获新功能类似
catch (IOException|SQLException ex)
阅读下面的帖子后变得更加困惑......任何人都可以对这个问题给出一个简单直接的解释。
https://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html
注意:如果一个 catch 块处理多个异常类型,则 catch 参数是隐式 final 的。在此示例中,catch 参数 ex 是最终参数,因此您不能在 catch 块中为其分配任何值。
https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.4 ...以及多捕获子句的异常参数(第 14.20 节)。uni-catch 子句的异常参数永远不会隐式声明为 final,但实际上可能是 final。
解决方案
关于修改捕获的异常的部分:
- 这实际上不是一种常见的做法。你不会发现很多人提倡它。
- 在某些情况下,您有自己的异常类,其中包含某些信息。也许该信息不因代码抛出而闻名。但是代码捕获有它,并将其添加到异常对象中。然后记录该异常,或使用“丰富”数据重新抛出它。
关于其他点:
- 您现在可以进行多次捕获的事实与此无关。但显然,多重捕获使得修改捕获的异常变得不那么有趣。
- 实际上 final 意味着编译器可以发现没有重新分配局部变量。该变量是最终的,但您没有将该关键字放在声明的前面。
推荐阅读
- php - 自动将表数据从 Postgresql 更新或同步到 Mysql,是否可以不使用 excel 导入或复制?
- asp.net-core - 使用配置文件进行集成测试
- c# - 使用 WebApplicationFactory 时如何使用 JWT Bearer Scheme
- c# - 我无法用日期转换一天
- angular - 这两种 Observable 语法有什么区别
- python-3.x - 将 Python2 十六进制变量转换为 Python3
- angular - 如何使导航组件在 Angular 中保持在顶部
- matlab - Ubuntu 中的 Matlab:为什么不能使用“系统”将结果存储到文件中?
- entity-framework-core - 如何使用 FromSqlRaw 在 Entity Framework Core 中返回 int 列表?
- c - 以抽象数据类型打印矩阵的函数