如何修复使用 instanceof 确定内部错误类型时“本地捕获的抛出异常”

How to fix 'thrown exception caught locally' when using instanceof to determine internal errors type

提问人:msolefonte 提问时间:10/12/2020 更新时间:10/12/2020 访问量:2601

问:

我有一段代码可以加载一组插件。对于每个插件,在 try catch 块中调用一个函数列表,以确定插件是否失败并采取相应的行动。同时,插件的多个函数之一可能会返回特定错误,这意味着插件没有失败,但无法有效执行下一个函数。

让我们看一个例子(代码是 Typescript,但我将使其尽可能与语言无关):

for each plugin:
  try: 
    plugin.function1(data)
    plugin.function2(data)
    plugin.function3(data)

    try:
      plugin.function4(data)
    catch error:
      if error instanceof PluginNotValidForThisKindOfDataError:
        continue
      else:
        throw error
   
    plugin.function5(data)
    plugin.function6(data)
  catch error:
    log(plugin has failed)   

(我希望代码足够清晰。如果需要,我会更新它)

可以看出,我执行并解析了可能的错误,因为其中一个(有多个)是“可容忍的”,只是意味着它对特定的 .但是,我仍然必须抛出其他错误,因为它们不好。最后,我捕获全局错误集以确定插件是否崩溃。function4function5function6data

我在 IDE 中得到的 JetBrains(特别是 WebStorm)是一个警告。但我无法重新想象如何重做该块以采取不同的行动。我没有使用抛出作为流控制,而只是传递错误。thrown exception caught locally

我承认主要问题是在 Javascript 中我不能这样做,这将是最佳情况(希望有一天会添加它)。但是,使用我拥有的工具,我该如何重构它呢?catch PluginNotValidForThisKindOfDataError

谢谢。

由于特定的 Javascript try-catch 方法,添加到与语言无关的 javascript 和 javascript

JavaScript TypeScript 异常 语言无关 JetBrains-IDE

评论


答:

3赞 T.J. Crowder 10/12/2020 #1

我看到三个选项:

  1. 理想情况下,插件不会在这样的非错误条件下抛出错误。相反,让它返回一个值,告诉问题中的代码它是否应该运行函数 5 和 6。

    但是,如果您想保持原样,您可以:

  2. 忽略警告(可能有一种方法可以在一行内禁用它),或者

  3. 不要重新投掷;相反,在 outer () 中执行相同的操作,后跟 .如果只是一个函数调用或类似的调用,那么重复并不理想,但也不可怕。如果该步骤有任何复杂性,请将其隔离到一个函数(甚至可能是一个本地函数)中,并从两个位置调用它。catchlog(plugin has failed)continue

评论

0赞 msolefonte 10/12/2020
1 和 3 都很难实现,因为示例过于简化,我无法完全控制插件,第二个捕获实际上不是日志,而是另一对 instanceof/throw(再次,我讨厌 JS 错误处理)。但是,我将尝试调整插件以返回错误代码,因为正如您所说,这是最好的方法。
1赞 msolefonte 10/13/2020
我的最后一个方法是创建一个新函数,其中包含从第二个到末尾的所有内容。如果我实际记录了这种情况,将抛出转换为函数可能很有用,但情况并非如此。无论如何,由于您完美地解释了要采取的三种方法,因此我将您的答案标记为正确。tryfunction6