【问题标题】:Throw anonymous exceptions in Java在 Java 中抛出匿名异常
【发布时间】:2013-06-24 10:39:08
【问题描述】:

在 Java 中可以抛出任何异常,即使它只是在抛出时声明,示例如下:

import org.springframework.dao.DataAccessException;

 // DataAccessException - is abstract class

 } catch (DataAccessException dae) {
      throw new DataAccessException("Exception while executing SQL: \n" + sql
            +    "\nparams: " + paramsToString(params), dae) {
                          private static final long serialVersionUID = 1L;
      };
 } 

请分享您的想法,这种方法的好坏。

扩展 RuntimeException(不是抽象的)并立即将其抛出的相同问题。

【问题讨论】:

标签: java exception styles


【解决方案1】:

请分享您的想法,这种方法的好坏。

应该是合法的……根据我对Java语言的理解。

我认为从功能的角度来看这是没有意义的。调用者仍然必须捕获您创建其匿名子类型的基本异常。而且它不像匿名子类的名称传达任何有用的信息......

从代码可读性和可维护性的角度来看,我认为它是不好的。它无缘无故地晦涩难懂,而且我无法辨别出有用的效果。

而且有风险做一些奇怪的事情可能会破坏......例如你的调试器、源代码分析器或你的 Java 链中的一些其他工具。


总之,没有兑换功能是个坏主意。

【讨论】:

    【解决方案2】:

    是的。你的例子完全没问题。 Exception 实例只是一个类(扩展 Exception)名称以及捕获它时需要的信息。通常你只需要类名(对于 catch 语句)。通常包括消息和堆栈跟踪。 (尽管它们对于捕获的异常都相当无用。)但有时需要更多信息。扩展一个类是一种很好的方法。

    如果性能很重要(使用 SQL 时可能不重要)覆盖 fillInStackTrace。填充堆栈跟踪很慢,如果您打算捕获异常,则不需要它。

    不要扩展 RunTimeException;你不会被警告可能抛出它的方法,你可能会忘记捕捉它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 2012-07-23
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多