Java异常:异常是否应在其中包含其消息或将其作为参数

时间:2014-08-09 22:01:43

标签: java exception exception-handling conventions custom-exceptions

每当我需要定义自定义异常时,如果它的消息不会根据上下文而改变,我将消息放在该异常中。像这样:

public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException() {
        super("User with given name is not found!");
    }
}

而不是:

public class UserNotFoundException extends RuntimeException {

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

因此,每次抛出此异常时,我都不需要提供消息,我知道每个地方的消息都应该相同。

您认为我的方法存在问题吗?你更喜欢哪一个?为什么?

2 个答案:

答案 0 :(得分:5)

为什么不允许提供消息,但提供默认值。

public class UserNotFoundException extends RuntimeException {

    private static final String DEFAULT_MESSAGE = "User with given name is not found!";

    public UserNotFoundException() {
        this(DEFAULT_MESSAGE);
    }

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

答案 1 :(得分:1)

我认为只有使用

才有意义
public class UserNotFoundException extends RuntimeException {

    public UserNotFoundException() {
        super("User with given name is not found!");
    }
}

当且仅当您使用具有给定名称的用户时才会抛出此异常。但这不是正确的方法。例如,如果Java源代码编写了这样的硬编码代码。您甚至无法定义自己的自定义消息。最佳实践将是第二种方法

public class UserNotFoundException extends RuntimeException {

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

以便您或任何其他可能希望扩展代码的程序员可以方便地重用您的自定义异常。记住可重用性是OOP的核心功能之一。任何与此相反的做法都不是一个很好的做法。