okhttp-перехватчик-остановка неустранимых исключений из входа в Crashlytics
Я использую Retrofit в приложении для android, и это, в свою очередь, означает, что я использую OkHttp. Я только что отправился на Альфу и увидел в своем отчете crashlytics ряд несмертельных исключений, регистрируемых. Все это происходит из моего перехватчика 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.read (Okio.java:139)
okio.AsyncTimeout.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 и т. д.?
3 ответов
Non-fatal Exception
регистрируется при вызове Crashlytics.logException(Exception)
прямо в коде
пожалуйста, прочитайте ниже информацию :
Crashlytics
для Android позволяет регистрировать пойманные исключения в блоках catch вашего приложения! Чтобы использовать эту функцию, просто добавьте вызов Crashlytics.logException(Exception)
к Вашему блоку catch:
try {
myMethodThatThrows();
} catch (Exception e) {
Crashlytics.logException(e);
// handle your exception here!
}
все зарегистрированные исключения будут отображаться как" неустранимые " проблемы на панели мониторинга Crashlytics. Сводка по проблеме будет содержать всю информацию о состоянии, которую вы используете для получения от сбоев вместе с поломками по версии Android и аппаратного устройства.
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 исключений в сеансе, старые исключения теряются.
просто искать Crashlytics.logException
в вашем коде, вы обязательно найдете его где-нибудь. Он регистрируется только оттуда.
иначе исключения on Response response = chain.proceed(request);
приведет к сбою приложения:)
дикое предположение :), вы можете использовать RxJava & in onError(throwable: Throwable)
вашего подписчика вы можете регистрировать его, как показано ниже
override fun onError(throwable: Throwable) {
Crashlytics.logException(throwable)
}