创建自定义异常所需的最小值

时间:2016-06-22 19:41:04

标签: java exception

我想在我的代码中创建一个自定义异常。像这样定义

public class MyException extends Exception {}

仅提供空构造函数,它仍然可用。所以我需要手动定义所有构造函数。 是否有我应该覆盖的构造函数列表,我应该这样做吗?

MyException(/* args */) {
    super(/* same args */);
}

3 个答案:

答案 0 :(得分:3)

你的样本看起来很好。

没有脚本规则,只需覆盖您需要在应用程序中使用的构造函数,您可以看到构造函数列表here for java 8

No-arg构造函数

我认为覆盖这个构造函数总是有意义的,因为覆盖no-arg构造函数总是好的,因为如果你不确定要创建什么样的对象,那么你可能想要使用它

但一般情况下,在没有消息的情况下抛出异常是不好的做法,因此我建议您将其更改为private / protected以明确声明您不希望在没有消息的情况下创建异常

Exception()
// Constructs a new exception with null as its detail message.

包含消息的构造函数

我会首先覆盖这个,因为它允许传递额外的信息,并且它非常方便。

Exception(String message)
// Constructs a new exception with the specified detail message.

重新抛出异常

如果您需要使用/不使用其他信息重新抛出异常,则可以覆盖这些。

Exception(String message, Throwable cause)
// Constructs a new exception with the specified detail message and cause.
Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
// Constructs a new exception with the specified detail message, cause, suppression enabled or disabled, and writable stack trace
     

启用或禁用。

Exception(Throwable cause)
// Constructs a new exception with the specified cause and a detail message of (cause==null ? null : cause.toString()) (which typically
     

包含原因的类和详细信息。

答案 1 :(得分:3)

这完全取决于您要在异常中存储的信息。

但一般来说,允许提供根本原因是一个好主意。并且,除非您想要在异常中更多结构化信息(如代码或类似的东西),否则消息也是一个好主意。

所以是的,提供与Exception相同的构造函数,并委托给相应的超级构造函数,这是一个很好的经验法则。

您也可以通过不提供任何没有消息参数的构造函数来鼓励(或强制)调用者始终传递消息。

答案 2 :(得分:1)

如果您只打算使用throw new MyCustomException(),那么您的第一个示例将起作用,但如果出现异常......您可能希望提供更多信息。它可以使调试更容易。

如果其他人要使用您的异常类,他们可能希望能够使用更明确的消息,或者在他们重新抛出的情况下将其传递给他们。或者,如果其他人必须调试您的代码,如果它没有消息或原因而不会抛出异常,那么不被勒死的可能性要好得多。

例如我在上一个项目中使用的自定义异常

public final class CryptorException extends Exception {

    private static final long serialVersionUID = 1L;

    public CryptorException(String message) {
        super(message);
    }

    public CryptorException(Throwable cause) {
        super(cause);
    }

    public CryptorException(String message, Throwable cause) {
        super(message, cause);
    }
}

这就是全部。这需要几秒钟的努力。注意虽然我没有实现没有参数的构造函数。如果您需要,您需要添加它。

从技术上讲,构造函数不会覆盖任何东西,因为构造函数不会从头开始继承。

有关serialVersionUID的说明,请参阅this question。如果您没有对任何内容进行序列化,那么您就不需要关心它了。