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

Javascript 如何修复';本地捕获的抛出异常';使用instanceof确定内部错误类型时,javascript,typescript,exception,language-agnostic,jetbrains-ide,Javascript,Typescript,Exception,Language Agnostic,Jetbrains Ide,我有一个加载一组插件的代码块。对于每个插件,在try-catch块内调用函数列表,以确定插件是否失败,并相应地采取行动。同时,插件的多个函数中的一个可以返回一个特定的错误,这意味着插件没有失败,但无法使用数据执行下一个函数 让我们看一个例子(代码是Typescript,但我将尽可能使它不受语言的影响): (我希望代码足够清晰。如果需要,我会更新) 如图所示,我执行function4并解析可能的错误,因为其中一个(有多个)是“可容忍的”,只是意味着它对于function5和function6这组特

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

让我们看一个例子(代码是Typescript,但我将尽可能使它不受语言的影响):

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

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

在我的IDE中,JetBrains(特别是WebStorm)是一个本地捕获的抛出异常。但我无法重新想象如何重做该块,以采取不同的行动。我没有使用抛出作为流控制,只是传递错误

我承认,主要的问题是,在Javascript中,我无法
捕获pluginnotvalidforthisdataerror
,这将是最佳情况(希望有一天添加它)。但是,用我现有的工具,我如何重构它呢

多谢各位

由于特定的javascript try-catch方法,添加到了与语言无关的
javascript
,我看到了三个选项:

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

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

  • 忽略警告(可能有一种方法可以对一行禁用它),或者

  • 不要再扔了;相反,执行与您在外部
    捕获
    日志(插件失败)
    )中执行的相同操作,然后执行
    继续
    。如果只是一个函数调用或类似的调用,那么复制并不理想,但也不可怕。如果该步骤有任何复杂性,请将其隔离到一个函数(甚至可能是一个局部函数)中,并从两个位置调用它

  • 我认为有三种选择:

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

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

  • 忽略警告(可能有一种方法可以对一行禁用它),或者

  • 不要再扔了;相反,执行与您在外部
    捕获
    日志(插件失败)
    )中执行的相同操作,然后执行
    继续
    。如果只是一个函数调用或类似的调用,那么复制并不理想,但也不可怕。如果该步骤有任何复杂性,请将其隔离到一个函数(甚至可能是一个局部函数)中,并从两个位置调用它


  • 1和3都很难实现,因为示例过于简单,我无法完全控制插件,第二个捕获实际上不是日志,而是另一对instanceof/throw(同样,我讨厌JS错误处理)。但是,我将尝试调整插件以返回错误代码,正如您所说,这是最好的方法。我的最终方法是创建一个新函数,它包含从第二个
    try
    function6
    结尾的所有内容。如果我实际记录了这个案例,那么将抛出转换为函数可能会很有用,但情况并非如此。在任何情况下,由于您对这三种方法进行了完美的解释,我将您的答案标记为正确。1和3都很难实现,因为示例过于简单,我无法完全控制插件,第二个捕获实际上不是日志,而是另一对instanceof/throw(同样,我讨厌JS错误处理)。但是,我将尝试调整插件以返回错误代码,正如您所说,这是最好的方法。我的最终方法是创建一个新函数,它包含从第二个
    try
    function6
    结尾的所有内容。如果我实际记录了这个案例,那么将抛出转换为函数可能会很有用,但情况并非如此。无论如何,由于你对这三种方法做了完美的解释,我认为你的回答是正确的。
    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)