抛出异常时的 Java 最佳实践:抛出核心 Java 异常潜在可重用的内置异常列表

2022-09-01 13:00:16

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

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

  • 非法争议异常
  • 不支持的操作异常
  • IOException
  • 别人?

我错过了其他人吗?我在这里找到了“核心”例外的基本列表:http://rymden.nu/exceptions.html,并进行了幽默的解释。

谢谢!

编辑:

是否有一个很好的“核心”例外列表?

到目前为止的列表:


答案 1

是的,这样做非常好。事实上,它甚至写在有效的Java,第2版中。见第248页第60项:“赞成使用标准例外”

重用预先存在的异常有几个好处。其中最主要的是,它使您的API更易于学习和使用,因为它符合程序员已经熟悉的既定约定。紧随其后的是,使用 API 的程序更易于阅读,因为它们不会因不熟悉的异常而混乱。最后(也是最少的),更少的异常类意味着更少的内存占用和更少的加载类所花费的时间。


答案 2

你的问题中提供的列表作为快速参考资料不是很有用,而且开发文档中的大多数描述对我来说似乎都很神秘。

我还没有遇到任何最可重用的内置异常的简短列表。我已经尽了最大努力在下面创建一个,但我相信它远非完美。

github gist 链接(或查看下面的当前内容)

潜在可重用的内置异常列表

按估计效用组织

非法争议异常

抛出以指示方法已通过非法或不适当的参数。

IndexOutOfBoundsException

抛出以指示某种类型的索引(如数组、字符串或向量)超出范围。

算术异常

当请求的数学运算无意义或不可能时抛出。例:int x = 1/0;

非法状态异常

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

DataFormatException

当您收到格式不正确的数据时,请抛出此消息。例:MyClass.applyJSONString("{non:sense,all,garbled=definitely.not;json{{{")

超时异常

如果某件事花了太长时间而你放弃了,那就扔掉这个。

键选择器异常

如果您尝试使用密钥查找对象,并且未找到该对象,或者该密钥在其他方面无效,我认为抛出它是有道理的,但我并不真正理解有关它的开发文档

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

IOException

阅读/写作有问题?引发此异常。

ScriptException

运行某种形式的脚本并发现它存在问题(不是I / O或解析)?引发此异常。

通用安全异常

如果遇到与安全相关的问题,请抛出此命令。

运行时异常

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


推荐