我遇到了一个扩展Exception的类:
public class MyException extends Exception
{
public MyException()
{
super();
}
public MyException(final String argMessage, final Throwable argCause)
{
super(argMessage, argCause);
}
public MyException(final String argMessage)
{
super(argMessage);
}
public MyException(final Throwable argCause)
{
super(argCause);
}
}
这种方式是不是没有意义的扩展异常,因为所有重写的构造函数都只是调用超类Exception?
答案 0 :(得分:10)
不,这不是没有意义的。您可以catch
以这种方式处理特定异常并专门处理它,而不是捕获一般Exception
,这可能无法在所有情况下处理。
有了这个,你可以这样做:
try {
foo();
} catch (MyException e) {
handleMyException(e);
}
如果您不知道如何处理一般Exception
,则无法做到这一点,但您可以更好地处理MyException
。
它还提高了可读性 - 最好将方法声明为throws MyException
(通常名称更好),然后throws Exception
- 你知道这样做会更好。
答案 1 :(得分:5)
是的,这是有原因的。它允许您区分异常的类型。
假设以下代码:
try {
// some instructions
} catch (MyFirstException firstException) {
// Handler for the first exception
} catch (MySecondException secondException) {
// Handler for the first exception
} catch (Exception exception) {
// Handler for all other exceptions
}
如果MyFirstException
和MySecondException
继承自Exception并覆盖所有方法,则可以在catch块中区分它们。因此,您可以为两个例外使用不同的处理程序。
答案 2 :(得分:0)
当你总是做catch (Exception e)
时,你实际上会抓住Exception
的每个子类,这也特别适用于你通常不想捕捉的RuntimeException
。这只能通过捕捉Throwable