簡體   English   中英

使用 instanceof 確定內部錯誤類型時如何修復“在本地捕獲的拋出異常”

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

我有一個加載一組插件的代碼塊。 對於每個插件,在 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)   

(我希望代碼足夠清楚。如果需要我會更新它)

可以看出,我執行了function4並解析了可能的錯誤,因為其中一個(有多個)是“可容忍的”,僅意味着它對於具有該特定data集的function5function6無效。 但是,我仍然必須拋出其他錯誤,因為它們不好。 最后,我會捕獲全局錯誤集以確定插件是否已崩潰。

我在 IDE 中得到的,JetBrains(特別是 WebStorm)是thrown exception caught locallythrown exception caught locally警告。 但我無法重新想象如何重做該塊以采取不同的行動。 我沒有使用 throws 作為流量控制,而只是傳遞錯誤。

我承認主要問題是在 Javascript 中我無法catch PluginNotValidForThisKindOfDataError ,這將是最佳情況(希望有一天會添加)。 但是,使用我擁有的工具,我該如何重構呢?

非常感謝。

由於特定的 Javascript try-catch 方法,添加到與language-agnosticjavascript

我看到三個選項:

  1. 理想情況下,插件不會在這樣的非錯誤條件下拋出錯誤。 相反,讓它返回一個值,告訴您問題中的代碼是否應該運行函數 5 和 6。

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

  2. 忽略警告(可能有一種方法可以將其禁用一行),或者

  3. 不要重投; 相反,做你在外部catch做的同樣的事情( log(plugin has failed) ),然后是continue 假設這只是一個單一的函數調用或類似的函數,重復並不理想,但也不可怕。 如果該步驟有任何復雜性,請將其隔離到一個函數中(甚至可能是一個本地函數)並從兩個地方調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM