何时引发异常

时间:2019-01-06 23:56:30

标签: exception language-agnostic

我对此进行了搜索,发现了this question。最佳答案是最有帮助的,但是我需要澄清一下,并且没有足够的声誉来发表评论,所以我为此提出了一个新问题。

基本上,用户“ 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 <>....。只要在文档和/或注释中提供了此类内容即可。

所以我想我的问题是,因为给出的答案的前提是,当破坏了他们试图做的事情的假设时,应该抛出异常,并且从技术上讲,提供的示例有一种解决方法,这种解决方法如果可以发现异常,则最好比抛出异常更好,或者如果异常取决于情况,则抛出异常是决定因素是什么?

1 个答案:

答案 0 :(得分:1)

在您描述抛出错误的情况下,绝对是更好的选择。使用功能时,请说

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
}