tl; dr 如果某个任务可能在多个事件中失败,例如API提取,划分,解析等,是否有多个try-catch
块或单个块来 catch'em all ?
我有一个可以执行两项任务的功能。
a
和b
。a/b
这是实际问题的简化版本。我想问一下如何处理异常,因为该任务可能在两个步骤之一中均失败:
a/b
由于b = 0
而导致错误。我可以想到两种方法。
选项I
try {
const data = getFromAPI();
const result = data[0] / data[1];
return result;
} catch (err) {
// Catch all errors here...
}
选项II
try {
try {
const data = getFromAPI();
} catch(err) {
// Catch all API errors here..
}
const result = data[0] / data[1];
return result;
} catch (err) {
// Catch division errors here...
}
答案 0 :(得分:1)
您应该首先检查正在使用的数据(在合理范围内)。之后,您仅应尝试/捕获可能失败的代码/当超出您的控制范围时,别无其他。所以我会给你另一个选择。 为了回答您的其他问题,请不要制作嵌套的try catch语句。这根本没有道理。如果可能发生不同类型的异常,请尝试识别异常的类型(例如,使用instanceOf方法或错误对象上的属性)并进行处理。
方案III
try {
var data = getFromAPI();
} catch (err) {
// Catch errors from the API request here...
}
if(Array.isArray(data) && !isNaN(data[0]) && !isNaN(data[1]) && data[0] > 0 && data[1] > 0) {
const result = data[0] / data[1];
return result;
}
return 0;
答案 1 :(得分:0)
这是一个问题,答案取决于系统,是要告诉用户还是想知道引发了哪种异常,而不是尝试多次try / catch,建议您在内部使用开关或if catch而不是多个嵌套的try / catch。
try{
//your code
}catch(ex){
if(ex instanceof ReferenceError){
//handle error
}
}
答案 2 :(得分:0)
您可以简单地使用:
try {
const data = getFromAPI(); //wait for request to finish
if(typeof data !== 'object') throw('fetch error');
if(data[0] === 0 ||
data[1] === 0 ||
typeof data[0]!== 'number' ||
typeof data[1]!== 'number'
) throw('your error here');
const result = data[0] / data[1];
return result;
} catch (err) {
// Catch all errors here...
}