[英]When to throw exceptions
我进行了搜索,发现了这个问题 。 最佳答案是最有帮助的,但是我需要澄清一下,并且没有足够的声誉来发表评论,所以我为此提出了一个新问题。
基本上,用户“ The Digital Gabeg”指出,如果不满足代码的预设条件,则会引发错误。 给出的示例是,如果List <>的长度超过50,则方法返回true,否则返回false。 但是,如果传递给该方法的对象不是List <>,则该方法将无法准确返回true或false,因此它没有返回任何内容,而是引发了错误(尽管严格来说,该逻辑不是很准确,如果object不是具有成员(即List <>或数组)的对象类型,那么它的长度超过50仍然是错误的(因为要使长度超过50,它首先需要具有一个“长度”(为对象定义)]。
在此示例中,最明显的漏洞是将方法的参数指定为List <>甚至可以避免将其他任何内容传递给该方法。 那不是我真正的问题。 出于争论的目的,让我们假设由于某种原因,您不能确保在编译时传递给该方法的对象是List <>-即使是这种情况,可以通过更改方法的返回类型,从布尔值返回为int,并将返回值指定为0表示false,1表示true,-1表示其他任何值。 这可能是值的任意分配,但是它可以处理情况而无需引发异常。 您甚至可以让它返回-1、0和1以外的其他值来表示其他内容。 例如,如果传递的是数组而不是List <>,则可以对true和false分别使用值2和3,但要注意的是,提供的对象确实有(或没有)成员超过50个,但传递的对象严格来说,它不是List <>....。只要在文档和/或注释中提供了此类内容即可。
所以我想我的问题是,因为给出答案的前提是当破坏了他们试图做的假设时应该抛出异常,并且从技术上讲,提供的示例有一个替代方法,这种替代方法比抛出更好。如果可以发现异常,或者最好抛出异常,并且取决于情况,那么决定因素是什么?
在您描述抛出错误的情况下,绝对是更好的选择。 使用功能时,可以说
boolean x = listBigEnough(list)
我们可以假设函数是如何工作的。 如果我们有
int x = listBigEnough(list)
我们不知道x代表什么。 我们需要添加多少个元素以使其足够大? x = -3是什么意思? 也许我们假设1 = true 0 = false并执行
if x==0 {
//increase size of list
} else {
//continue as usual
}
但是,如果出现错误并且listBigEnough返回-1会发生什么?
如果程序由于listBigEnough的编写者使其抛出错误而崩溃,则我们知道如何修复代码。 而且错误不会总是使程序崩溃,我们可以捕获错误
list = //user input
try {
if listBigEnough(list) {
//do thing
} else {
//tell user to get larger list
}
} catch (NotAListError) {
// tell user to give a list
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.