![]() |
1
2
我认为电子邮件示例是对已检查异常的最佳防御。您有可能出错并且是暂时的,所以检查异常的存在会让您考虑它。如果一切都是运行时异常,那么您的应用程序只会因为一些微不足道的原因而崩溃,没有人会考虑它。 无论如何,如果对于您的项目,一般的答案是将其抛到顶部,那么在运行时异常中包装是完全有效的。需要考虑的几个问题: 坚持例外链接。不这样做的唯一原因是,如果您正在序列化异常,那么某些包含不可序列化成员的异常可能会使事情变得有趣。这似乎不是事实,所以不要允许例外吞咽。如果有必要,使用initcuse。下面是我们项目中的一个小助手方法:
这有助于人们避免抛出异常的需要。 我更喜欢避免不必要的链接runtimeexception和错误throwables,当一个方法上有许多不同的已检查异常,而开发人员只是捕获异常时,不可避免地会发生这种情况,因此我建议使用一个这样的静态方法:
有两种选择。一种方法是使其无效(就像这段代码一样),这样调用方的好处是永远不会忘记抛出结果。缺点是如果你有这样的东西:
编译器不会喜欢你的。您必须在catch之后返回,并在try之前声明一个变量。 另一个选项是将异常作为runtimeexception返回(只抛出错误),并让调用方进行抛出。编译器更快乐,但是调用方可能忘记了这样做,并且在调用方法之前不加抛出就调用它,然后异常就被吞没了。 |
![]() |
2
1
异常应该由与之相关的层处理。 因为一个异常被选中并不意味着你可以处理它,或者你必须在你的应用程序的每一层处理它。此时,您可能希望将它们转换为运行时异常。因此,您可以忽略(记录)异常、无法从中恢复的异常以及可以恢复的异常。问题是相同的异常类型,例如sqlException,可以输入多个类别。IOException也是另一个例子。 无法恢复的编程错误应为运行时异常,并应在容器附近捕获以进行日志记录或使应用程序“轻微”失败。访问JDBCPreparedStatement中的无效索引是一个编程错误。 没有连接问题。因此,在数据层,您设法区分,然后将不可恢复的异常转换为运行时异常并抛出它。有时,这并不意味着重试连接会起作用。 业务方法应该只关注与业务相关的异常,这就是为什么您不在代码中的任何地方处理NullPointerExceptions或ArrayIndexOutOfBoundsException,并且不必将它们放入方法签名中的原因。同样的逻辑也适用于计算部门员工平均工资的数据源不可知的业务方法,如果用户提供了错误的部门代码,则不应抛出sqlExceptions,而应抛出invalidDeptexception等内容。 throws声明也是自文档化代码的,如果您抛出自己的运行时异常,请确保正确地文档化。 |
![]() |
3
1
一般来说,我建议遵循
对于电子邮件,不确定您的具体情况。总的来说,这听起来是AOP的完美案例。如果你在Jee5,那是一个习惯
|
![]() |
4
0
对于数据库访问异常,我建议查看 Spring 处理它们。我发现这很容易在实践中使用。 |
![]() |
5
0
您从何处得到这样的想法:您永远无法从sqlexception中恢复(除其他之外)?在精心编写的代码中,您通常可以。首先,整个sqlTransientException层次结构都是针对可以从中恢复的异常(例如sqlTransientConnectionException)。当异常事实上可以处理时,将其视为不可恢复的异常是一个常见的错误。 我认为你的“减亏”政策没有什么错,比如说电子邮件的问题。当然,应该通知用户。 |
|
M.Jane · 组织和编写异常类的正确方法 7 年前 |
![]() |
shubham daharwal · java中的内部捕获异常 7 年前 |
![]() |
Jon · 如何在不需要任何操作的情况下处理Python异常 7 年前 |
![]() |
felix1415 · C++捕获(标准::异常和e)与捕获(…) 7 年前 |
![]() |
k0pernikus · 如何在scala中键入可能引发异常的函数? 7 年前 |