哪个更好/更有效:检查错误值或捕获Java中的异常
2022-09-04 00:51:56
在Java中哪个更有效:检查错误值以防止异常发生或让异常发生并捕获它们?
下面是两个示例代码块来说明这种差异:
void doSomething(type value1) {
ResultType result = genericError;
if (value1 == badvalue || value1 == badvalue2 || ...) {
result = specificError;
} else {
DoSomeActionThatFailsIfValue1IsBad(value1);
// ...
result = success;
}
callback(result);
}
对
void doSomething(type value1) {
ResultType result = genericError;
try {
DoSomeActionThatFailsIfValue1IsBad(value1);
// ...
result = success;
} catch (ExceptionType e) {
result = specificError;
} finally {
callback(result);
}
}
一方面,你总是在做比较。另一方面,老实说,我不知道系统的内部做了什么来生成异常,抛出它,然后触发catch子句。它有效率较低的声音,但如果在非错误情况下它不会增加开销,那么平均而言,它的效率会更高。这是什么?它是否添加了类似的检查?在为异常处理添加的隐式代码中是否进行了检查,即使使用额外的显式检查层也是如此?也许这总是取决于异常的类型?我没有考虑什么?
让我们也假设所有“坏值”都是已知的 - 这是一个明显的问题。如果您不知道所有坏值 - 或者列表太长且不规则 - 那么异常处理可能是唯一的方法。
那么,每种方法的优缺点是什么,为什么?
需要考虑的附带问题:
- 如果值在大多数时候是“坏的”(会引发异常),你的答案会如何变化?
- 这在多大程度上取决于正在使用的 VM 的具体情况?
- 如果对语言X提出同样的问题,答案会有所不同吗?(更一般地说,这是在询问是否可以假设检查值总是比依赖异常处理更有效,因为它增加了当前编译器/解释器的更多开销。
- (新)引发异常的操作很慢。即使没有引发异常,进入 try 块是否有开销?
与SO的相似之处: