異常傳播特性
- 當一個協程由于一個議程運行失敗時,他會傳播這個異常并傳遞給它的父級。接下來,父級會進行下面幾步操作:
- 取消它自己的子級
- 取消它自己
-
將異常傳播給它的父級
image.png
異常捕獲
- 使用CoroutineExceptionHandler對協程的異常進行捕獲
- 以下條件滿足時,異常就回被捕獲:
- 時機:異常是被自動拋出異常的協程所拋出的(使用lanch,而不是async時)
- 位置:在CoroutineScope的CoroutineContext中或在一個根協程(CoroutineScope或者survisorScope的直接子協程)中。
Android中全局異常處理
- 全局異常處理器可以獲取到所有協程未處理的未捕獲異常,不過它并不能對異常進行捕獲,雖然不能阻止程序崩潰,全局異常處理器在程序調試和異常上報等場景中仍然有非常大的用處。
- 我們需要在classpath 下面創建META-INF/services目錄,并在其中傳經一個名為kotlinx.coroutines.CoroutineExceptioneHandler的文件,文件內容就是我們得全局異常處理器的全類名
取消與異常
- 取消與異常緊密相關,協程內部使用CancellationException來進行取消,這個異常會被忽略。
- 當子協程被取消時,不會取消它的父協程。
- 如果一個協程遇到了CancellationException以為的異常,它將使用該異常取消它的父協程。當父協程的所有子協程都結束后,異常才會被父協程處理。