什么是好的“错误检查”模式(Java)?

2022-09-02 21:42:51

我将解释输入错误检查的含义。

假设您有一个函数 。doSomething(x)

如果函数成功完成,则执行某些操作,但不返回任何内容。但是,如果有错误,我希望收到通知。这就是我所说的错误检查。doSomething

总的来说,我正在寻找检查错误的最佳方法。我想到了以下解决方案,每个解决方案都有一个潜在的问题。

  1. 标记错误检查。如果完成成功,则返回 。否则,它将返回布尔值或错误字符串。问题:副作用。doSomething(x)null

  2. 引发异常。如果遇到错误,则引发异常。问题:如果仅对参数执行错误检查,则抛出 a 似乎不合适。doSomething(x)IllegalArgumentException

  3. 在函数调用之前验证输入。如果错误检查仅适用于函数的参数,则可以在调用函数之前调用验证程序函数。问题:如果类的客户端在调用之前忘记调用验证程序函数,该怎么办?doSomething(x)doSomething(x)

我经常遇到这个问题,任何帮助或朝着正确方向的点将不胜感激。


答案 1

引发异常是最好的方法。

如果仅对参数执行错误检查,则引发非法参数异常似乎不合适。

为什么?这就是此例外的目的。


答案 2
  1. 标志错误检查

这在某些情况下是合适的,具体取决于您所说的“错误”的含义。

来自 API 的一个示例:如果您尝试将一个对象添加到 ,该对象已经包含另一个新对象,则该方法将排序为“失败”,并通过返回来指示这一点。(请注意,我们处于一个水平,从技术上讲,它甚至不是一个“错误”!Setequalsaddfalse

2.引发异常

这是默认选项。

现在的问题是,您应该选择已检查的异常(您需要声明或/子句)还是未选中的异常(扩展的异常)。这里有一些经验法则。throwstrycatchRuntimeException

Java 实践 -> 选中的异常与未选中的异常

  • 未选中的例外:表示程序中的缺陷(bug) - 通常传递给非私有方法的无效参数。

  • 已检查的例外:表示程序直接控制范围之外的区域中的无效条件(无效用户输入、数据库问题、网络中断、文件缺失)

请注意,这是一个未经检查的异常,非常适合在参数不正常时进行抛出。IllegalArgumentException

如果要引发已检验的异常,您可以 A) 通过扩展来滚动自己的异常,B) 使用一些现有的已检验异常或 C) “链接”运行时异常,例如:ExceptionIOExceptionthrow new IOException(new IllegalArgumentException("reason goes here..."));

3.在函数调用之前验证输入

依靠客户应该在电话之前清理/检查他的论点这一事实对我来说似乎是一个坏主意。


推荐