使用函数在返回或抛出之间进行选择

时间:2019-01-09 14:29:52

标签: javascript

我在代码中的多个位置有以下switch语句:

try {
   ...
} catch(e) {
   switch(x){
      case A:
         throw e;
      default:
         return e;
   }
}

我希望能够将其包装在这样的函数中:

function handle(e) {
   switch(x) {
      case A:
         throw e;
      default:
         return e;
   }
}

try {
   ...
} catch(e) {
   handle(e);
}

我知道上述情况是行不通的(执行“ handle”的代码仍然不会抛出或返回任何东西),但是使代码多一点干燥是非常好的。

1 个答案:

答案 0 :(得分:0)

通常来说,这应该不是问题。您的示例有点通用(例如:Ax是什么?需要传递它们还是可以从错误中导出它们?),因此本示例提供了一个通用的“解决方案”,例如好(希望)能满足您的需求。

您可以考虑为各种类型的错误创建“错误情况”处理程序。如果处理程序无法找到定义的错误情况,则仅每throw s次错误。

// Higher-order function to create "error handlers":
function handleBy (cases) {
  return function (err) {
    if (cases[err.constructor.name]) {
      return cases[err.constructor.name](err);
    }
    throw err;
  }
}


// create an error handler which returns different "defaults" or "fallbacks"
// for certain types of errors. alternatively, it returns the error itself
var handleRead = handleBy({
  TypeError: function (err) {
    return 'default value';
  },
  SyntaxError: function (err) {
    return err;
  }
});


// this is the action to be guarded
var unsafeAction = function () {
  try {
    return window.foo.bar;
  } catch (e) {
    return handleRead(e);
  }
}

console.log(unsafeAction())