使用嵌套的try-catch块

时间:2019-10-14 16:41:18

标签: javascript

tl; dr 如果某个任务可能在多个事件中失败,例如API提取,划分,解析等,是否有多个try-catch块或单个块来 catch'em all


我有一个可以执行两项任务的功能。

  1. 从API中提取两个数字,ab
  2. 执行a/b

这是实际问题的简化版本。我想问一下如何处理异常,因为该任务可能在两个步骤之一中均失败:

  1. 获取本身失败。
  2. 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...
}

3 个答案:

答案 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...
  }