【问题标题】:How to catch all coroutine uncaught exception in android without changing ```scope.launch {...}```?如何在不更改```scope.launch {...}```的情况下在android中捕获所有协程未捕获的异常?
【发布时间】:2021-01-13 16:16:51
【问题描述】:

我想知道是否有一种协程方法可以从 android 的任何范围内捕获所有未捕获的异常?

我尝试使用Thread.setDefaultUncaughtExceptionHandler,它可以工作,但我想知道是否可以通过其他方式启用。

编辑:我希望在不更改协程启动的情况下进行全局异常处理。 (保持 scope.launch {...} 不变)

【问题讨论】:

  • 没有异常处理程序可以捕获所有异常而不更改启动,如您所说。此时您唯一拥有的就是使用Thread.uncaughtExceptionHandler,它将捕获您的应用程序中的所有异常

标签: android kotlin kotlin-coroutines coroutine


【解决方案1】:

您可以像这样使用类似于Thread.uncaughtExceptionHandler 的 CEH(协程异常处理程序):

class ExceptionHandlerViewModel(
    private val apiHelper: ApiHelper,
    private val dbHelper: DatabaseHelper
) : ViewModel() {

    private val users = MutableLiveData<Resource<List<ApiUser>>>()

    private val exceptionHandler = CoroutineExceptionHandler { _, exception ->
        users.postValue(Resource.error("Something Went Wrong", null))
    }

    fun fetchUsers() {
        viewModelScope.launch(exceptionHandler) {
            users.postValue(Resource.loading(null))
            val usersFromApi = apiHelper.getUsers()
            users.postValue(Resource.success(usersFromApi))
        }
    }

    fun getUsers(): LiveData<Resource<List<ApiUser>>> {
        return users
    }

}

欲了解更多信息:https://kotlinlang.org/docs/reference/coroutines/exception-handling.html#coroutineexceptionhandler

【讨论】:

  • 我已经很好了,但我不想更改我所有的启动代码行。我希望在不更改协程启动的情况下进行全局异常处理。
  • 目前,协程不支持所有范围的全局异常处理。但是您可以提供全局 coroutineScope 和在此范围内运行的每个 launch,以便您在根范围内处理异常。
猜你喜欢
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2014-04-12
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多