我有一个加载一组插件的代码块。对于每个插件,在try catch块中调用一个函数列表,以确定插件是否失败,并采取相应的行动。同时,插件的多个函数之一可能返回一个特定的错误,这意味着插件没有失败,但对数据执行下一个函数无效。
让我们看看一个示例(代码是类型记录,但我将尽可能地使它成为语言不可知论者):
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警告。但我无法重新想象如何重做这个块,以改变它的行为。我不是使用抛出作为流控制,而是传递错误。
我承认,主要的问题是,在Javascript中,我不能做catch PluginNotValidForThisKindOfDataError,这将是最优的情况(希望有一天它会增加)。但是,用我所拥有的工具,我如何重构它呢?
非常感谢。
添加到language-agnostic和javascript中,因为使用了特定的Javascript try-catch方法。
发布于 2020-10-12 11:26:24
我认为有三种选择:
在
不过,如果你想保持原样,你也可以:
catch (log(plugin has failed))中做同样的事情,然后是continue。如果这只是一个函数调用或类似的,复制并不理想,但也不可怕。如果该步骤有任何复杂性,请将其隔离为一个函数(甚至可能是一个本地函数),并将其从两个地方调用。https://stackoverflow.com/questions/64316858
复制相似问题