在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(不是抽象的)并立即抛出它。
答案 0 :(得分:8)
请分享您的想法这种做法有多糟糕或好看。
根据我对Java语言的理解,这应该是合法的。
我认为从功能角度来看这是毫无意义的。调用者仍然必须捕获您创建匿名子类型的基本异常。而且它不像匿名子类的名称传达任何有用的信息......
从代码可读性和可维护性的角度来看,我认为这很糟糕。这是没有充分理由的模糊,也没有我能辨认的有用效果。
存在一种风险,即做一些奇怪的事情,比如它可能会破坏一些东西......比如你的调试器,源代码分析器或Java链中的其他工具。
总之,没有兑换功能是一个坏主意。
答案 1 :(得分:0)
是。你的例子完全没问题。 Exception实例只是一个类(扩展了Exception)名称以及捕获时需要的信息。通常,类名称就是您所需要的(对于catch语句)。通常包括消息和堆栈跟踪。 (虽然它们对于捕获的异常都是无用的。)但有时需要更多信息。扩展课程是一种很好的方法。
如果性能很重要(使用SQL时可能不会)覆盖 fillInStackTrace 。填写堆栈跟踪很慢,如果您计划捕获异常,则不需要它。
不要扩展RunTimeException;你不会被告知可以抛出它的方法,你可能忘了抓住它。