如果我们有像这样的基本处理程序
protected val baseHandler = CoroutineExceptionHandler { _, e ->
handleError(e)
}
并通过try-catch块执行代码
scope.launch(baseHandler){
try{
throw ...
}
catch(e:Exception) {
}
是否可以先在catch块中处理异常,然后在基本处理程序中作为后备处理? 此代码的目标是为所有项目协程提供一个基本的异常处理程序。
答案 0 :(得分:2)
您创建并传递的CoroutineExceptionHandler
将用于协程中未处理的异常。
例如,如果您想捕获一种特定类型的Exception
,并处理CoroutineExceptionHandler
中的所有其他异常,则可以try-catch
仅使用该类型:
GlobalScope.launch(baseHandler) {
try {
throw IllegalStateException("oh no it failed")
} catch (e: IllegalStateException) {
// Handles the exception
}
}
如果在IllegalStateException
块中引发了try
以外的异常,则该异常将传播到您的处理程序。
或者,您可以在catch
分支中捕获内容,但是如果您在那里无法处理,则将它们重新抛出,而是将其交给处理程序处理:
GlobalScope.launch(baseHandler) {
try {
// Code that can throw exceptions
} catch (e: Exception) {
if (/* some condition */) {
throw e
}
}
}