我想在我的代码中创建一个自定义异常。像这样定义
public class MyException extends Exception {}
仅提供空构造函数,它仍然可用。所以我需要手动定义所有构造函数。 是否有我应该覆盖的构造函数列表,我应该这样做吗?
MyException(/* args */) {
super(/* same args */);
}
答案 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。如果您没有对任何内容进行序列化,那么您就不需要关心它了。