Okhttp - Interceptor - Прекращение нефатальных исключений от входа в Crashlytics
Я использую Retrofit в приложении для Android, и это, в свою очередь, означает, что я использую OkHttp.
Я только что отправился в Альфу, и, увидев в своем отчете о катастрофе, записано несколько нефатальных исключений.
Все это происходит из-за моего перехватчика okhttp, а затем регистрируются исключения, которые, как представляется, являются действиями в ситуациях, когда сеть может быть пятнистой или если соединение выпадает и т.д.
Как я могу это сделать, чтобы эти исключения не выходили из строя в crashlytics и, таким образом, загромождали мое представление об исключениях, происходящих в приложении?
Некоторые примеры исключений:
> Non-fatal Exception: javax.net.ssl.SSLHandshakeException
Connection closed by peer
okhttp3.internal.connection.RealConnection.connectTls (RealConnection.java:281)
okhttp3.internal.connection.RealConnection.establishProtocol (RealConnection.java:251)
okhttp3.internal.connection.RealConnection.connect (RealConnection.java:151)
okhttp3.internal.connection.StreamAllocation.findConnection (StreamAllocation.java:192)
okhttp3.internal.connection.StreamAllocation.findHealthyConnection (StreamAllocation.java:121)
okhttp3.internal.connection.StreamAllocation.newStream (StreamAllocation.java:100)
okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:42)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)
okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:93)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)
okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:93)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:120)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)
MY_INTERCEPTOR.intercept (AuthenticationInterceptor.java:30)
и
> Non-fatal Exception: javax.net.ssl.SSLException
Read error: ssl=0xdee45cc0: I/O error during system call, Software caused connection abort
okio.Okio$2.read (Okio.java:139)
okio.AsyncTimeout$2.read (AsyncTimeout.java:237)
okio.RealBufferedSource.indexOf (RealBufferedSource.java:345)
okio.RealBufferedSource.readUtf8LineStrict (RealBufferedSource.java:217)
okio.RealBufferedSource.readUtf8LineStrict (RealBufferedSource.java:211)
okhttp3.internal.http1.Http1Codec.readResponseHeaders (Http1Codec.java:189)
okhttp3.internal.http.CallServerInterceptor.intercept (CallServerInterceptor.java:75)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:45)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)
okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:93)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)
okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:93)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:120)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:92)
okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:67)
MY_INTERCEPTOR.intercept (AuthenticationInterceptor.java:30)
Это мой код перехватчиков:
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
if( response.code() == HTTP_AUTHENTICATION_ERROR_CODE ){
Intent intent = new Intent(ACTION_LOGOUT_ACTION);
mContext.sendBroadcast(intent);
}
return response;
}
Получаю, что я мог поймать любое исключение IOException из вызова "продолжить", но разве это не помешало бы правильной обработке сетевых ошибок и исправлений OkHttp?
Ответы
Ответ 1
Non-fatal Exception
регистрируется, когда вы вызываете Crashlytics.logException(Exception)
явно в коде
Прочтите ниже информацию:
Crashlytics
для Android позволяет регистрировать обнаруженные исключения в блоках блокировки приложения! Чтобы использовать эту функцию, просто добавьте вызов в Crashlytics.logException(Exception)
к вашему блоку catch:
try {
myMethodThatThrows();
} catch (Exception e) {
Crashlytics.logException(e);
// handle your exception here!
}
Все зарегистрированные исключения будут отображаться как "нефатальные" проблемы на панели мониторинга Crashlytics. В сводке проблем будет содержаться вся информация о состоянии, которую вы используете для получения от сбоев, а также с разбивкой по версии Android и аппаратного устройства.
Ответ 2
В Crashlytics хранится Неустранимое исключение, когда вы используете Crashlytics.logException(), см. Ниже код для перехватчика, он бросает Исключение IOException, но исключение не будет видно на панели управления Нефатальный Исключение, в то время как мы не регистрируем его.
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
logger.info(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
logger.info(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
поэтому, если вы хотите зарегистрировать исключение в разделе Нефатальное исключение, просто используйте Crashlytics.logException();
и Crashlytics хранит только последние 8 исключений в данном сеансе приложения. Если ваше приложение выбрасывает более 8 исключений в сеансе, более старые исключения теряются.
Ответ 3
Просто найдите Crashlytics.logException
в своей кодовой базе, вы обязательно найдете ее где-нибудь. Он регистрируется только оттуда.
В противном случае любое исключение на Response response = chain.proceed(request);
приведет к сбою вашего приложения:)
Дикая догадка:),, вы можете использовать RxJava и в onError(throwable: Throwable)
вашего подписчика вы можете записывать его, как показано ниже
override fun onError(throwable: Throwable) {
Crashlytics.logException(throwable)
}