使用 instanceof 确定内部错误类型时如何修复 'thrown exception caught locally'

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

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

让我们看一个示例(代码是 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)   

(希望代码足够清晰,有需要我会更新)

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

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

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

非常感谢。

添加到 language-agnosticjavascript 因为特定的 Javascript try-catch 方法

我看到三个选项:

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

    不过,如果您想保持原样,您可以:

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

  3. 不要re-throw;相反,在外部 catch (log(plugin has failed)) 中执行相同的操作,然后是 continue。如果这只是一个函数调用或类似的调用,那么重复并不理想,但也不可怕。如果该步骤有任何复杂性,请将其隔离为一个函数(甚至可能是一个本地函数)并从两个地方调用它。