3

在 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 (这不是抽象的)并立即抛出它的相同问题。

4

2 回答 2

9

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

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

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

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

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


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

于 2013-06-27T04:30:41.600 回答
0

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

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

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

于 2013-06-27T19:17:45.687 回答