断开 try/catch 语句时出错

Error breaking out of a try/catch statement

提问人:MfyDev 提问时间:7/31/2023 最后编辑:MfyDev 更新时间:7/31/2023 访问量:77

问:

当我对 NPM 包进行编程时,我需要一个语句,但错误有时会从部分中断并终止整个过程。try{}catch{}try{}

由于用于从部分捕获错误并使用部分处理它们,我预计错误将被捕获并传递给 ,但是当函数使用 、not 语句返回错误时,错误就会爆发。我尝试了不同的调用方法,例如 或 ,但问题仍然存在。try{}catch{}try{}catch{}catch{}returnthrow.call(...).apply(...)

这通过:

let result;

let throwError = () => throw new Error("I didn't break out!");

try {
  let res = throwError();
  result = res;
} catch(err) {
  result = {
    message: err.message,
    name: err.name
  }
}

result; // {name: "Error", message: "I didn't break out!"}

这失败了:

let result;

let returnError = () => new Error("I broke out!")

try {
  let res = returnError(); // Error: I broke out!
  result = res;
} catch(err) {
  result = {
    message: err.message,
    name: err.name
  }
}
JavaScript 节点 .js 错误处理 try-catch

评论

0赞 jfriend00 7/31/2023
你的第一个代码块是否应该调用 .现在,它正在召唤.throwError()returnError()
0赞 MfyDev 7/31/2023
@jfriend00已修复。
0赞 Bergi 7/31/2023
呃,为什么你要返回一个错误对象而不是抛出一个异常?只是不要那样做。
0赞 MfyDev 7/31/2023
@Bergi 当我评论这个问题的答案时,or 功能是由用户提供的(我不知道内容),我想确保我的功能不会被用户破坏。returnErrorthrowErrortry{}catch{}
0赞 Bergi 8/1/2023
@MfyDev 好吧,您不对库用户编写的损坏代码负责。记录提供的函数应引发异常,并仅处理这种情况。不接受返回的错误,这只是一个奇怪的模式。如果绝对需要,请检查返回值并向 devtools 打印警告,指出程序员犯了错误,应该修复它。

答:

0赞 Matthew Herbst 7/31/2023 #1

这里没有问题。如果你想抓住一个被抛出的错误,会这样做。如果要捕获返回的错误,则需要进行不同的检查。try/catch

let result;

let returnError = () => new Error("I broke out!")

try {
  let res = returnError();
  
  if (res instanceof Error) {
    throw res;
  }

  result = res;
} catch(err) {
  result = {
    message: err.message,
    name: err.name
  }
}

评论

0赞 Matthew Herbst 7/31/2023
虽然在上面的代码中,由于您控制了 ,因此根本不需要 ,因为该函数永远不会抛出。只需使用returnErrortry/catchif/else
0赞 MfyDev 7/31/2023
在我的实际应用程序代码中,我无法控制.它由用户提供。returnError
0赞 Matthew Herbst 7/31/2023
那么我上面的例子正是你想要的:)