Exception 何时抛出异常

Exception 何时抛出异常,exception,language-agnostic,Exception,Language Agnostic,我找了一下,发现了这个。上面的答案非常有帮助,但我需要一些澄清,而且我没有足够的声誉发表评论,所以我为它创建了一个新问题 基本上,用户“数字Gabeg”表示,当代码的预设不满足时,抛出一个错误。给出的示例是,如果一个列表的长度超过50,则一个方法返回true,否则返回false。但是,如果传递给该方法的对象不是列表,则该方法无法准确返回true或false,因此它不会返回任何内容,而是抛出一个错误(尽管严格来说,如果对象不是具有成员的对象类型(即列表或数组),则该逻辑并不十分准确)那么它的长度超

我找了一下,发现了这个。上面的答案非常有帮助,但我需要一些澄清,而且我没有足够的声誉发表评论,所以我为它创建了一个新问题

基本上,用户“数字Gabeg”表示,当代码的预设不满足时,抛出一个错误。给出的示例是,如果一个列表的长度超过50,则一个方法返回true,否则返回false。但是,如果传递给该方法的对象不是列表,则该方法无法准确返回true或false,因此它不会返回任何内容,而是抛出一个错误(尽管严格来说,如果对象不是具有成员的对象类型(即列表或数组),则该逻辑并不十分准确)那么它的长度超过50仍然是错误的(因为为了使长度超过50,它需要首先为对象定义一个“长度”)

本例中最明显的漏洞是,将方法的参数指定为列表甚至可以避免向方法传递任何其他内容。但这不是我真正的问题。出于论证的目的,让我们假设无论出于何种原因,您都无法确保在编译时传递给该方法的对象是一个列表-即使是这样,也可以通过将该方法的返回类型从布尔值更改为int,并指定返回值0表示false,1表示true,其他的都是-1。这可能是一个任意的值赋值,但它处理这种情况时不需要抛出异常。您甚至可以让它返回除-1、0和1之外的其他值来表示其他内容。例如,如果传递的是数组而不是列表,则可以使用值2和3表示true和false,但需要注意的是,虽然提供的对象有(或没有)超过50个成员,但传递的对象严格来说不是列表……只要文档和/或注释中提供了此类内容


因此,我想我的问题是,既然给出答案的前提是,当他们试图做的事情背后的假设被破坏时,应该抛出异常,并且在技术上,对于所提供的示例,有一个变通方法,那么,如果可以找到,这种变通方法是否比抛出异常更可取,或者抛出异常更可取,如果它取决于具体情况,那么决定因素是什么?

在您描述的情况中,抛出错误肯定是更好的选择。当使用函数时,让我们说

boolean x=listBigEnough(list)

我们可以假设函数是如何工作的。如果我们有

int x = listBigEnough(list)
我们不知道x代表什么。我们需要在列表中添加多少元素才能使其足够大?x=-3是什么意思?也许我们假设1=真0=假

if x==0 {
//increase size of list
} else {
//continue as usual
}
但是如果出现错误并且ListBigThough返回-1,会发生什么呢

如果程序崩溃是因为ListBigThough的编写者使它抛出了一个错误,那么我们知道如何修复代码。此外,错误并不总是会使程序崩溃,我们可以捕获错误

list = //user input
try {
  if listBigEnough(list) {
    //do thing
  } else {
   //tell user to get larger list
  }
} catch (NotAListError) {
// tell user to give a list
} 

Lasse,我明白你的意思,这是有道理的,但是这种歧义不能通过注释来处理吗(即,在函数上方的注释中添加以下内容:)/-1=参数不是列表//2=真,但参数是数组而不是列表//等等。。。我的意思是,如果其他人不打算阅读,那么使用评论(自我提醒除外)的目的是什么?你可以,也应该,将返回信息放在评论中。但是有些人可能没有阅读注释,想想当没有编写函数的人正在使用它时会发生什么。更糟糕的是,A编写了函数,B在另一个文件的某个地方使用了函数,C现在想更新B编写的文件,但对A编写的任何内容都没有任何线索。还有一个因素是代码被更新了,但我们忘记了更新文档。打个比方,我们可以(而且确实)在高速公路上设置车道标记。但设置防撞栏可能更安全。这是否值得,当然取决于道路(或软件)的大小。