okhttp - 拦截器 - 阻止非致命异常被记录到Crashlytics

问题描述 投票:14回答:3

我在Android应用程序中使用Retrofit,这反过来意味着我使用OkHttp。我刚刚去了Alpha,并在我的崩溃报告中看到了许多非致命的异常被记录。所有这些都源于我的okhttp拦截器,然后记录的异常似乎都是在网络可能不稳定或连接丢失等情况下有效的事情。

我怎样才能做到这一点,以便这些例外不会记录到崩溃关系中,从而混淆了我对应用程序中出现的异常的看法?


一些例外的例子:

> 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正确处理网络错误等吗?

java android retrofit2 interceptor okhttp
3个回答
1
投票

在代码中调用Non-fatal Exceptionexplicitly时会记录Crashlytics.logException(Exception)

请阅读以下信息:

Crashlytics for Android允许您在应用程序的catch块中记录捕获的异常!要使用此功能,只需将Crashlytics.logException(Exception)调用添加到catch块:

try {
  myMethodThatThrows();
} catch (Exception e) {
  Crashlytics.logException(e);
  // handle your exception here! 
}

所有记录的异常将在Crashlytics仪表板中显示为“非致命”问题。您的问题摘要将包含您用于从崩溃中获取的所有状态信息以及Android版本和硬件设备的细分。


1
投票

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个异常,则会丢失旧的异常。


0
投票

只需在您的代码库中搜索Crashlytics.logException,您肯定会在某处找到它。它只从那里开始记录。

否则Response response = chain.proceed(request);上的任何异常都会导致你的应用崩溃:)

狂野猜测:),您可能正在使用RxJava&在您的订阅者的onError(throwable: Throwable)中,您可能会在下面记录它

override fun onError(throwable: Throwable) {
       Crashlytics.logException(throwable) 
}
© www.soinside.com 2019 - 2024. All rights reserved.