Подтвердить что ты не робот

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?

4b9b3361

Ответ 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) 
}