diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt index d82a75923..f43fa1317 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.network +import exh.util.withRootCause import okhttp3.Call import okhttp3.OkHttpClient import okhttp3.Request @@ -47,11 +48,18 @@ fun Call.asObservable(): Observable { } fun Call.asObservableSuccess(): Observable { + // Record stacktrace at creation time for easier debugging + // asObservable is involved in a lot of crashes so this is worth the performance hit + val asyncStackTrace = Exception("Async stacktrace") + return asObservable().doOnNext { response -> if (!response.isSuccessful) { response.close() throw Exception("HTTP error ${response.code()}") } + }.onErrorReturn { + // Set root cause to async stacktrace and throw again + throw it.withRootCause(asyncStackTrace) } } diff --git a/app/src/main/java/exh/util/ExceptionUtil.kt b/app/src/main/java/exh/util/ExceptionUtil.kt index 5ae80d525..084523106 100644 --- a/app/src/main/java/exh/util/ExceptionUtil.kt +++ b/app/src/main/java/exh/util/ExceptionUtil.kt @@ -4,4 +4,14 @@ inline fun ignore(expr: () -> T): T? { return try { expr() } catch (t: Throwable) { null } } +fun T.withRootCause(cause: Throwable): T { + val curCause = this.cause + if(curCause == null) { + this.initCause(cause) + } else { + curCause.withRootCause(cause) + } + + return this +} \ No newline at end of file