簡體   English   中英

捕獲Scala期貨中未處理的錯誤

[英]Catching unhandled errors in Scala futures

如果Scala未來失敗,並且沒有“觀察”失敗的延續(或者唯一的延續使用map / flatMap並且在失敗的情況下不運行),那么錯誤就不會被檢測到。 我希望至少記錄這些錯誤,所以我可以找到錯誤。

我使用術語“觀察到的錯誤”,因為在.Net Tasks中,當GC收集Task對象時,有機會捕獲“未觀察到的任務異常”。 類似地,使用同步方法,可以記錄終止線程的未捕獲異常。

在Scala期貨中,“觀察”失敗意味着某些延續或其他代碼會在未來處置之前讀取存儲在未來值中的Exception。 我知道最終確定不是確定性的或可靠的,並且可能這就是為什么它不能用於捕獲未處理的錯誤,盡管.Net確實成功地做到了這一點。

有沒有辦法在Scala中實現這一目標? 如果沒有,我應該如何組織我的代碼以防止未處理的錯誤錯誤?

今天我有, andThen checkResult附加到各種未來。 但是很難知道何時使用它以及何時不使用:如果庫方法返回Future,它不應該checkResult並記錄錯誤本身,因為庫用戶可能會處理失敗,因此責任落在用戶身上。 當我編輯代碼時,我有時需要添加檢查,有時需要刪除它們,這種手動管理肯定是錯誤的。

您可以在返回Future的函數中使用Future.recover

因此,例如,在最簡單的情況下,您可以“記錄”錯誤並重新拋出原始異常:

def libraryFunction(): Future[Int] = {
   val f = ...
   f.recover {
      case NonFatal(t) =>
         println("Error : " + t)
         throw t
   }
}

注意使用NonFatal來匹配捕獲的合理的所有異常類型。
如果您願意,那個恢復區塊可以同樣返回替代結果。

我已經得出結論,沒有辦法一般性地注意到Scala期貨中未處理的錯誤。

暫無
暫無

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

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