什么是好的“错误检查”模式(Java)?
我将解释输入错误检查的含义
假设你有一个函数doSomething(x)
如果函数成功完成doSomething
,则执行一些操作,但不返回任何内容<但是,如果有错误,我希望得到通知<这就是我所说的错误检查
总的来说,我在寻找检查错误的最佳方法。我想到了以下解决方案,每个都有潜在的问题
标记错误检查如果
doSomething(x)
成功完成返回null
。否则,它将返回布尔值或错误字符串问题:副作用引发异常如果
doSomething(x)
遇到错误,则引发异常问题:如果只对参数执行错误检查,抛出IllegalArgumentException
似乎不合适在函数调用之前验证输入如果错误检查只针对函数的参数,那么可以在调用
doSomething(x)
函数之前调用验证器函数问题:如果类的客户机在调用doSomething(x)
之前忘记调用验证器函数,该怎么办
我经常遇到这个问题,任何帮助或正确方向上的一点都将不胜感激
# 1 楼答案
这在某些情况下是合适的,这取决于你所说的“错误”是什么意思
API中的一个示例:如果尝试向
Set
添加一个对象,该对象已经包含另一个equals
对象,则add
方法排序为“失败”,并通过返回false
来指示这一点。(请注意,从技术上讲,这甚至不是一个“错误”!)这是默认选项
现在的问题是,您应该选择选中的异常(需要
throws
声明或try
/catch
子句)还是未选中的异常(扩展RuntimeException
的异常)。这里有一些规则从Java Practices -> Checked versus unchecked exceptions
未检查的异常:表示程序中的缺陷(bug)——通常是传递给非私有方法的无效参数
检查异常:表示程序无法直接控制的区域内的无效情况(无效用户输入、数据库问题、网络中断、缺少文件)
请注意
IllegalArgumentException
是一个未检查的异常,非常适合在参数不正常时抛出如果你想抛出一个选中的异常,你可以a)通过扩展
Exception
来滚动你自己的异常,B)使用一些现有的选中异常,或者C)“链”一个运行时异常,例如,一个IOException
:throw new IOException(new IllegalArgumentException("reason goes here..."));
在我看来,依靠客户应该在打电话之前净化/检查他的论点这一事实是个坏主意
# 2 楼答案
我决定在接口类型上通常使用哪种方法
用户界面(GUI):我在调用业务方法之前进行验证,因为用户想知道哪里出了问题
在组件或系统之间的技术接口上,接口应该已经过测试,并且工作正常。在这种情况下,我抛出异常
# 3 楼答案
抛出异常是最好的方法
为什么?这就是这个例外的目的