何时抛出异常
When to throw exceptions
我搜索了这个并找到了 this question。最上面的答案是最有帮助的,但我想要一些澄清并且没有足够的声誉 post 发表评论,所以我为此创建了一个新问题。
基本上,用户 "The Digital Gabeg" 声明当不满足代码的预设时,抛出错误。给出的示例是如果一个方法 return 如果 List<> 的长度超过 50,则为 true,否则为 false。但是,如果传递给该方法的对象不是 List<>,则该方法无法准确地 return true 或 false,因此它不会 returning 任何东西,而是抛出错误(尽管严格来说,逻辑不是很准确,如果对象不是具有成员的对象类型(即 List<> 或数组),那么它的长度超过 50 仍然是错误的 [因为为了使长度超过 50 , 它需要先为对象定义 "length"]).
此示例中最明显的漏洞是,将方法的参数指定为 List<> 甚至可以避免将任何其他内容传递给该方法。但这不是我的问题。为了争论起见,让我们假设无论出于何种原因您不能确保传递给该方法的对象在编译时是一个 List<> - 即使是这种情况,也可以通过更改return 方法的类型从 boolean 到 int 并指定 return 值为 0 表示 false,1 表示 true,-1 表示其他任何值。这可能是一个任意的值赋值,但它可以在不需要抛出异常的情况下处理这种情况。你甚至可以用它 return 除 -1、0 和 1 之外的其他值来表示其他事物。例如,如果传递的是数组而不是 List<>,则可以使用值 2 和 3 来表示 true 和 false,但需要注意的是,虽然提供的对象有(或没有)超过 50 个成员,但传递的对象不是严格意义上的 List<>.... 只要文档 and/or 注释中提供了此类内容。
所以我想我的问题是,因为给出答案的前提是当他们试图做的事情背后的假设被破坏时应该抛出异常,并且在技术上有针对所提供示例的解决方法,是如果可以找到此类解决方法比抛出异常更可取,还是抛出异常更可取,如果取决于情况,决定因素是什么?
在您描述的情况下抛出错误绝对是更好的选择。使用函数时,可以说
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 returns -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
}
我搜索了这个并找到了 this question。最上面的答案是最有帮助的,但我想要一些澄清并且没有足够的声誉 post 发表评论,所以我为此创建了一个新问题。
基本上,用户 "The Digital Gabeg" 声明当不满足代码的预设时,抛出错误。给出的示例是如果一个方法 return 如果 List<> 的长度超过 50,则为 true,否则为 false。但是,如果传递给该方法的对象不是 List<>,则该方法无法准确地 return true 或 false,因此它不会 returning 任何东西,而是抛出错误(尽管严格来说,逻辑不是很准确,如果对象不是具有成员的对象类型(即 List<> 或数组),那么它的长度超过 50 仍然是错误的 [因为为了使长度超过 50 , 它需要先为对象定义 "length"]).
此示例中最明显的漏洞是,将方法的参数指定为 List<> 甚至可以避免将任何其他内容传递给该方法。但这不是我的问题。为了争论起见,让我们假设无论出于何种原因您不能确保传递给该方法的对象在编译时是一个 List<> - 即使是这种情况,也可以通过更改return 方法的类型从 boolean 到 int 并指定 return 值为 0 表示 false,1 表示 true,-1 表示其他任何值。这可能是一个任意的值赋值,但它可以在不需要抛出异常的情况下处理这种情况。你甚至可以用它 return 除 -1、0 和 1 之外的其他值来表示其他事物。例如,如果传递的是数组而不是 List<>,则可以使用值 2 和 3 来表示 true 和 false,但需要注意的是,虽然提供的对象有(或没有)超过 50 个成员,但传递的对象不是严格意义上的 List<>.... 只要文档 and/or 注释中提供了此类内容。
所以我想我的问题是,因为给出答案的前提是当他们试图做的事情背后的假设被破坏时应该抛出异常,并且在技术上有针对所提供示例的解决方法,是如果可以找到此类解决方法比抛出异常更可取,还是抛出异常更可取,如果取决于情况,决定因素是什么?
在您描述的情况下抛出错误绝对是更好的选择。使用函数时,可以说
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 returns -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
}