【发布时间】:2020-03-01 00:10:49
【问题描述】:
我在我的 Android 应用程序中使用自定义 Interceptor 和 Retrofit 客户端,在某些特定情况下会引发异常。我正在尝试使用 Kotlin 协程使其工作。
问题是我无法处理前面提到的错误,因为在从 Interceptor 实例中抛出异常的那一刻,它会使整个应用程序崩溃,而不是被协程的 try/catch 语句捕获。当我使用 Rx 实现时,异常被完美地传播到 onError 回调中,我能够以我需要的方式处理它。
我猜这与用于网络调用的底层线程有某种关系,请查看下面的日志,从调用的地方,从抛出异常之前的拦截器,以及堆栈跟踪:
2019-11-04 17:17:34.515 29549-29729/com.app W/TAG: Running thread: DefaultDispatcher-worker-1
2019-11-04 17:17:45.911 29549-29834/com.app W/TAG: Interceptor thread: OkHttp https://some.endpoint.com/...
2019-11-04 17:17:45.917 29549-29834/com.app E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: com.app, PID: 29549
com.app.IllegalStateException: Passed refresh token can\'t be used for refreshing the token.
at com.app.net.AuthInterceptor.intercept(AuthInterceptor.kt:33)
我应该怎么做才能正确地从拦截器捕获和处理这个异常?我错过了什么吗?
【问题讨论】:
-
“我猜这在某种程度上与用于网络调用的底层线程有关”——你是说在 Rx 实现中,你所拥有的“运行线程”和“拦截线程”是一样的吗?您可能想要编辑您的问题并提供minimal reproducible example,显示拦截器代码和未处理的自定义异常的完整堆栈跟踪。
-
只有
IOException被传播给调用者。所有其他异常都委托给未捕获的异常处理程序。这意味着您应该抛出IOException,而不是抛出IllegalStateException。
标签: android exception okhttp interceptor kotlin-coroutines