8

我遇到了一个扩展 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 ,因此以这种方式扩展异常不是毫无意义吗?

4

3 回答 3

10

不,这不是毫无意义的。您可以catch通过这种方式处理特定异常并专门处理它,而不是捕获一般Exception情况,这可能并非在所有情况下都可以处理。

有了这个,你可以这样做:

try { 
  foo();
} catch (MyException e) {
  handleMyException(e);
}

如果您不知道如何处理 general ,这是不可能的Exception,但您可以处理MyException得更好。

它还提高了可读性 - 最好将方法声明为throws MyException(通常使用更好的名称)然后throws Exception- 你知道这样会更好地出错。

于 2012-05-25T08:57:28.463 回答
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
}

事件如果继承自 Exception 并覆盖所有方法,则可以在 catch 块中区分它们MyFirstExceptionMySecondException因此,您可以为这两个异常设置不同的处理程序。

于 2012-05-25T08:57:59.790 回答
0

当您总是做 a 时,catch (Exception e)您实际上会捕获 的每个子类Exception,这也特别适用于RuntimeException您通常不想捕获的 s 。这只能通过抓住变得更糟Throwable

于 2012-05-25T09:00:19.087 回答