是否应该抛出没有消息的异常?在什么情况下?例如,当子类化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);
}
}
答案 0 :(得分:3)
是否应该抛出没有消息的异常?在什么情况下?
如果某些代码实例化并且在没有消息的情况下抛出异常,则会抛出没有消息的异常。任何人都可以编写这样的代码。
当然,如果您尝试抛出的异常不允许您在没有消息的情况下实例化它...或者使用null
消息...那么您就不能。但是我从未遇到过坚持异常非异常的异常类。
当JVM本身抛出异常时,通常没有消息的情况是NullPointerException
。
如果你问应该...... ,从是否编写在没有消息的情况下抛出异常的代码是一种好的做法,答案是(IMO)否。但你可以制作你自己的想法。 (我想,如果异常名称说明了所有内容,那么消息将是多余的。但是,在调试时在堆栈跟踪中获取额外信息总是有用的。)
重新评论这些评论:
通常,您应该避免自定义异常。使用已经存在的。 - mre
为什么我要避免自定义异常? - Kyranstar
重点是在编写自定义异常之前,您应该查看是否存在与您提议的新异常相同的现有异常。例如,如果现有IllegalLexerArgumentException
符合您的目的,请不要编写自定义IllegalArgumentException
例外。
为什么呢?
出于同样的原因,我们没有充分的理由不写(比方说)自定义集合类。编写不必要的代码是一个坏主意,'这只是编译和测试的更多代码,运行时更多空间,维护者阅读的代码更多等等。
因为有很多异常类意味着相同的东西会使异常处理变得混乱。当您组合/重用更多库以构建大型应用程序时,此效果会变得更糟。
答案 1 :(得分:0)
如果您没有给出异常消息,那么当您收到错误时可以将消息弹出到另一个位置,但是建议您为每个异常创建一条消息并创建此异常的实例,扔掉它。
答案 2 :(得分:0)
如果文档明确说明触发异常的单个案例,则恕我直言,不要求异常中有消息。否则就是。一个好的经验法则是:让任何想要使用/调试该代码的人都很容易。
答案 3 :(得分:0)
老实说,我刚刚搜索了我们的代码,我们使用了没有消息的异常,但它们非常明显的。像:
UsernameCantBeEmptyException// example only
答案 4 :(得分:0)
我认为这取决于用例。例如NullPointerException
没有消息。有什么用?不知道。另一方面,ClassCastException
没有消息的java版本。作为应该被铸造的类型,这是一个非常令人讨厌的东西,很容易弄明白并且可以被程序使用。
只要我不知道跳过消息的用例似乎是合适的,我就不提供空的构造函数。 AFAIK是一个词法分析器,它表明这个变量具有这种类型,因此该行为是合适的。这表明异常消息甚至可能必须呈现给最终用户。在这种情况下,甚至本地化可能是强制性的。如果是这样的话,即使是一些工厂基础设施也是如此。可能是个好主意。
关于一般的自定义异常:经常出现这种情况的倾向,然后许多人发现实际上并不需要任何自定义异常。事实上,甚至还有一些不需要单一的程序。在商业上我从事200kLOC计划,我认为我们没有。但是对于具有特定处理需求的子系统(比如捕获所有LexerException以特定的方式显示它们,将它们与您自己的代码中的编程错误分开),拥有一些可能更有意义。我正在开展一个小型的OSS项目,在那里我甚至不止一个。但是你应该始终记住,额外的异常类型必须使异常处理更简单而不是更复杂。如果你经常有一个接一个的挡块,那么你肯定是在错误的轨道上。这是不必要的自定义例外的典型症状。