在Java中抛出匿名异常

时间:2013-06-27 04:22:02

标签: java exception styles

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

2 个答案:

答案 0 :(得分:8)

  

请分享您的想法这种做法有多糟糕或好看。

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

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

从代码可读性和可维护性的角度来看,我认为这很糟糕。这是没有充分理由的模糊,也没有我能辨认的有用效果。

存在一种风险,即做一些奇怪的事情,比如它可能会破坏一些东西......比如你的调试器,源代码分析器或Java链中的其他工具。


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

答案 1 :(得分:0)

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

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

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

相关问题