是否应抛出没有消息的异常?

时间:2014-04-12 23:49:43

标签: java exception

是否应该抛出没有消息的异常?在什么情况下?例如,当子类化Exception时,是否应该给出一个没有参数的构造函数?

public class LexerException extends Exception {
    public LexerException(String message) {
        super(message);
    }
}

public class LexerException extends Exception {
    public LexerException() {
        super();
    }
    public LexerException(String message) {
        super(message);
    }
}

5 个答案:

答案 0 :(得分:3)

  

是否应该抛出没有消息的异常?在什么情况下?

如果某些代码实例化并且在没有消息的情况下抛出异常,则会抛出没有消息的异常。任何人都可以编写这样的代码。

当然,如果您尝试抛出的异常不允许您在没有消息的情况下实例化它...或者使用null消息...那么您就不能。但是我从未遇到过坚持异常非异常的异常类。

当JVM本身抛出异常时,通常没有消息的情况是NullPointerException


如果你问应该...... ,从是否编写在没有消息的情况下抛出异常的代码是一种好的做法,答案是(IMO)否。但你可以制作你自己的想法。 (我想,如果异常名称说明了所有内容,那么消息将是多余的。但是,在调试时在堆栈跟踪中获取额外信息总是有用的。)


重新评论这些评论:

  

通常,您应该避免自定义异常。使用已经存在的。 - mre

     

为什么我要避免自定义异常? - Kyranstar

重点是编写自定义异常之前,您应该查看是否存在与您提议的新异常相同的现有异常。例如,如果现有IllegalLexerArgumentException符合您的目的,请不要编写自定义IllegalArgumentException例外。

为什么呢?

  1. 出于同样的原因,我们没有充分的理由不写(比方说)自定义集合类。编写不必要的代码是一个坏主意,'这只是编译和测试的更多代码,运行时更多空间,维护者阅读的代码更多等等。

  2. 因为有很多异常类意味着相同的东西会使异常处理变得混乱。当您组合/重用更多库以构建大型应用程序时,此效果会变得更糟。

答案 1 :(得分:0)

如果您没有给出异常消息,那么当您收到错误时可以将消息弹出到另一个位置,但是建议您为每个异常创建一条消息并创建此异常的实例,扔掉它。

答案 2 :(得分:0)

如果文档明确说明触发异常的单个案例,则恕我直言,不要求异常中有消息。否则就是。一个好的经验法则是:让任何想要使用/调试该代码的人都很容易。

答案 3 :(得分:0)

老实说,我刚刚搜索了我们的代码,我们使用了没有消息的异常,但它们非常明显的。像:

 UsernameCantBeEmptyException// example only

答案 4 :(得分:0)

我认为这取决于用例。例如NullPointerException没有消息。有什么用?不知道。另一方面,ClassCastException没有消息的java版本。作为应该被铸造的类型,这是一个非常令人讨厌的东西,很容易弄明白并且可以被程序使用。

只要我不知道跳过消息的用例似乎是合适的,我就不提供空的构造函数。 AFAIK是一个词法分析器,它表明这个变量具有这种类型,因此该行为是合适的。这表明异常消息甚至可能必须呈现给最终用户。在这种情况下,甚至本地化可能是强制性的。如果是这样的话,即使是一些工厂基础设施也是如此。可能是个好主意。

关于一般的自定义异常:经常出现这种情况的倾向,然后许多人发现实际上并不需要任何自定义异常。事实上,甚至还有一些不需要单一的程序。在商业上我从事200kLOC计划,我认为我们没有。但是对于具有特定处理需求的子系统(比如捕获所有LexerException以特定的方式显示它们,将它们与您自己的代码中的编程错误分开),拥有一些可能更有意义。我正在开展一个小型的OSS项目,在那里我甚至不止一个。但是你应该始终记住,额外的异常类型必须使异常处理更简单而不是更复杂。如果你经常有一个接一个的挡块,那么你肯定是在错误的轨道上。这是不必要的自定义例外的典型症状。