2017-11-01 7 views
0

私はいくつかの認証機能を処理するインターセプターを持っています。認証が失敗した場合、それはスローされ、例外がスローされます。私が例外をスローすると、例外を処理する場所にonFailureが呼び出されます。不幸にも、これは起こらず、アプリは単に完全にクラッシュします。私は何かが欠けているに違いないと確信していますが、私はそれを理解できないようです。 OkHttpは唯一それがIOExceptionだ場合Interceptorで発生した例外をキャッチしますインターセプターで例外をスローすると改造がクラッシュする

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher 
        Process: com.testapp.test.debug, PID: 28891 
        java.lang.Error: java.lang.Exception: test 
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1168) 
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
         at java.lang.Thread.run(Thread.java:764) 
        Caused by: java.lang.Exception: test 
         at com.testapp.test.data.networking.RetrofitWebApi$client$1.intercept(RetrofitWebApi.kt:90) 
         at com.testapp.test.data.networking.RetrofitWebApi$client$1.intercept(RetrofitWebApi.kt:76) 
         at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
         at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
         at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185) 
         at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135) 
         at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)  
         at java.lang.Thread.run(Thread.java:764)  
+0

IOExceptionが多分 –

答えて

0

val client = OkHttpClient.Builder() 
    // Add interceptor that throws 
    .addInterceptor { chain -> 
     throw Exception("test") 
    } 
    .build() 

retrofit = Retrofit.Builder() 
       .baseUrl(baseURL) 
       .client(client) 
       .build() 

api = retrofit.create(ApiInterface::class.java) 


// Create api call... 

apicall.enqueue(object : Callback<T> { 
    override fun onResponse(call: Call<T>?, response: retrofit2.Response<T>?) { 
     // .... 
    } 

    override fun onFailure(call: Call<T>?, t: Throwable?) { 
     // Expect to go here to handle the Exception. But the app crashes 
    } 
}) 

スタックトレース:ここで誰かが:)

コードとスタックトレース下のを助けることができると思います。あなたは、次のようにコードを変更した場合、予想通り

try { 
    Response response = getResponseWithInterceptorChain(); 
} catch (IOException e) { 
    responseCallback.onFailure(RealCall.this, e); 
} 

だから、あなたはあなたのonFailure方法でコールバックを得ることができます:あなたは以下の通りです(簡体字)このhere、関連部分を行うコードを見ることができます:

val client = OkHttpClient.Builder() 
    // Add interceptor that throws 
    .addInterceptor { chain -> 
     throw IOException("test") 
    } 
    .build() 
+0

を投げることを試みてください。この情報は見つけるのが非常に困難でした。どうもありがとう! – Djangow

関連する問題