OKHTTP -Interceptor-阻止非致命异常被记录到crashlytics



我在Android应用中使用Retrofit,这又意味着我使用Okhttp。我刚刚去了Alpha,在我的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$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;
}

我知道我可以从"继续"呼叫中抓住任何IOEXEXPION,但是会不会弄乱Okhttp的正确处理网络错误等?

Non-fatal Exception在您在代码中明确调用Crashlytics.logException(Exception)时已记录

请阅读以下信息:

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

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

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

crashlytics仅存储非致命异常当您使用
时 crashlytics.logexception(),请参见以下代码以获取interceptor,它正在投掷 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;
} 

因此,如果您想在> nont Fatal Exception 下记录异常

和crashlytics仅在给定的应用程序会话中存储最新的8个异常。如果您的应用程序在一个会话中抛出了8个以上的异常,则丢失了较旧的例外。

只需在代码库中搜索Crashlytics.logException,您肯定会在某个地方找到它。它仅从那里登录。

否则 Response response = chain.proceed(request); 上的任何异常将导致您的应用程序崩溃:)

野生猜测:),您可能正在使用rxjava&在您的订户的onError(throwable: Throwable)中,您可能会像以下

一样记录它
override fun onError(throwable: Throwable) {
       Crashlytics.logException(throwable) 
}

最新更新