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

vol*_*lni 17 java error-handling

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

假设你有一个功能doSomething(x).

如果函数成功doSomething完成某事并且什么都不返回.但是,如果有错误,我希望收到通知.这就是错误检查的意思.

一般来说,我一直在寻找检查错误的最佳方法.我想到了以下解决方案,每个解决方案都存在潜在问题.

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

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

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

我经常遇到这个问题,并且非常感谢任何帮助或正确方向上的一点.

Dan*_*ann 6

抛出异常是最好的方法.

如果仅对参数执行错误检查,则抛出IllegalArgumentException似乎不合适.

为什么?这就是这个例外的目的.

  • 您不必让运行时异常一直流到UI.您可以通过调用函数捕获它,而不是重新抛出它,打印用户友好的消息.例如,`tan(90度)`是未定义的,函数应抛出异常,但调用函数应将捕获的异常转换为用户的消息. (2认同)

aio*_*obe 5

  1. 标记错误检查

在某些情况下,这是合适的,具体取决于"错误"的含义.

来自API的一个示例:如果您尝试将对象添加到a Set,该对象已经包含equals新对象的另一个对象,则该add方法将"失败"并通过返回来指示此对象false.(请注意,我们处于技术上甚至不是"错误"的水平!)

2. 抛出异常

这是默认选项.

问题是,如果你去检查异常(你需要throws声明或try/ catch子句)或未经检查的异常(扩展的异常RuntimeException).这里有一些拇指规则.

Java实践 - >已检查与未检查的异常:

  • 未经检查的异常:表示程序中的缺陷(错误) - 通常将无效参数传递给非私有方法.

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

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

如果你想抛出一个已检查的异常,你可以通过扩展来推动自己的Exception异常,B)使用一些现有的已检查异常或C)"链"一个运行时异常,例如IOException:throw new IOException(new IllegalArgumentException("reason goes here..."));

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

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