抛出异常时的Java最佳实践:抛出核心Java异常

Jon*_*ott 28 java exception-handling exception

而不是抛出new Exception("Some message", maybeSomeCause),这意味着我的方法的所有调用者都需要捕获异常(可以包括RuntimeExceptions),我想在出现问题时抛出更具体的异常类型.

我可以创建自己的异常类型来扩展Exception或其他异常类型,但我很好奇是否重新使用核心Java语言带来的一些异常,例如:

  • 抛出:IllegalArgumentException
  • UnsupportedOperationException异常
  • IOException异常
  • 其他?

我还缺少其他人吗?我在这里找到了一个"核心"例外的基本列表:http: //rymden.nu/exceptions.html,带有诙谐的解释.

谢谢!

编辑:

是否有一个很好的"核心"例外清单?

到目前为止列表:

Jef*_*man 24

是的,这样做非常好.事实上,它甚至是在Effective Java,2nd ed中写的.请参见第248页的第60项:"赞成使用标准例外"

重用先前存在的异常有几个好处.其中最重要的是,它使您的API更易于学习和使用,因为它符合程序员已经熟悉的既定惯例.紧接其后的是,使用您的API的程序更容易阅读,因为它们不会被不熟悉的异常所混淆.最后(和最少),更少的异常类意味着更小的内存占用和更少的加载类所花费的时间.


7yl*_*l4r 17

您的问题中提供的列表不能用作快速参考资料,并且开发文档中的大多数描述对我来说都显得神秘莫测.

我没有遇到任何最可重复使用的内置异常的简短列表.我已尽力在下面创建一个,但我确信它远非完美.

github gist链接(或参见下面的当前内容)

可能可重复使用的内置异常列表

由估计的效用组织

抛出:IllegalArgumentException

抛出以指示方法已被传递非法或不适当的参数.

IndexOutOfBoundsException异常

抛出以指示某种索引(例如数组,字符串或向量)超出范围.

ArithmeticException

当请求的数学运算是非感性或不可能时抛出.例如:int x = 1/0;

IllegalStateException异常

应用程序未处于所请求操作的适当状态.示例:在加载或创建文件之前尝试保存.

DataFormatException

当您收到格式不正确的数据时,请将其丢弃.例:MyClass.applyJSONString("{non:sense,all,garbled=definitely.not;json{{{")

TimeoutException异常

如果事情花了太长时间并且你放弃了,就扔掉它.

KeySelectorException

我认为如果你试图使用密钥寻找一个对象而没有找到它或者密钥无效,那么抛出这个是有意义的,但我并不真正理解它上面的开发文档.

示例:myDataStructure.get("lookup_key");何时lookup_key不在数据结构中.

IOException异常

读/写有问题吗?抛出这个例外.

ScriptException

运行某种形式的脚本并发现它的问题(不是I/O或解析)?抛出这个例外.

GeneralSecurityException

如果遇到与安全相关的问题,请抛出此信息.

RuntimeException的

将此用于某些不适合任何其他类别的运行时错误.

  • 我不喜欢使用“java.util.zip.DataFormatException”来表示错误的 JSON,也不喜欢使用“javax.xml.crypto.KeySelectorException”来表示数据库查找失败,也不喜欢使用“java.security.GeneralSecurityException”来表示错误的密码,也不是除了实现脚本引擎之外的任何其他内容的“javax.script.ScriptException”。这些例外与特定包相关,并不适合一般用途。不过这个列表中的其他看起来都不错:-) (2认同)