ApiErrorExtractor { public boolean ioError(Throwable throwable) { if (throwable instanceof IOException || throwable instanceof IOError) { return true; } Throwable cause = throwable.getCause(); return cause != null && ioError(cause); }  boolean requestFailure(IOException e); boolean accessDenied(IOException e); boolean badRequest(IOException e); boolean unauthorized(IOException e); boolean accessDeniedNonRecoverable(IOException e); boolean clientError(IOException e); boolean internalServerError(IOException e); boolean itemAlreadyExists(IOException e); boolean itemNotFound(IOException e); boolean fieldSizeTooLarge(IOException e); boolean resourceNotReady(IOException e); boolean preconditionNotMet(IOException e); boolean rangeNotSatisfiable(IOException e); boolean rateLimited(IOException e); boolean quotaExceeded(IOException e); boolean userProjectMissing(IOException e); boolean ioError(Throwable throwable); boolean socketError(Throwable throwable); boolean readTimedOut(IOException e); String getErrorMessage(IOException e); IOException toUserPresentableException(IOException e, String action); String toUserPresentableMessage(IOException e, @Nullable String action); String toUserPresentableMessage(IOException e); @Nullable String getDebugInfo(IOException e); @Nullable static GoogleJsonResponseException getJsonResponseException(Throwable throwable); static final ApiErrorExtractor INSTANCE; static final int STATUS_CODE_RANGE_NOT_SATISFIABLE; static final String GLOBAL_DOMAIN; static final String USAGE_LIMITS_DOMAIN; static final String RATE_LIMITED_REASON; static final String USER_RATE_LIMITED_REASON; static final String QUOTA_EXCEEDED_REASON; static final String ACCOUNT_DISABLED_REASON; static final String ACCESS_NOT_CONFIGURED_REASON; static final String RESOURCE_NOT_READY_REASON; static final String FIELD_SIZE_TOO_LARGE_REASON; static final String USER_PROJECT_MISSING_MESSAGE; }
@Test public void testIOError() { Throwable ioError1 = new EOFException("io error 1"); assertThat(errorExtractor.ioError(ioError1)).isTrue(); assertThat(errorExtractor.ioError(new Exception(ioError1))).isTrue(); assertThat(errorExtractor.ioError(new RuntimeException(new RuntimeException(ioError1)))) .isTrue(); Throwable ioError2 = new IOException("io error 2"); assertThat(errorExtractor.ioError(ioError2)).isTrue(); assertThat(errorExtractor.ioError(new Exception(ioError2))).isTrue(); assertThat(errorExtractor.ioError(new RuntimeException(new RuntimeException(ioError2)))) .isTrue(); Throwable ioError3 = new IOError(new Exception("io error 3")); assertThat(errorExtractor.ioError(ioError3)).isTrue(); assertThat(errorExtractor.ioError(new Exception(ioError3))).isTrue(); assertThat(errorExtractor.ioError(new RuntimeException(new RuntimeException(ioError3)))) .isTrue(); Throwable notIOError = new Exception("not io error"); assertThat(errorExtractor.ioError(notIOError)).isFalse(); assertThat(errorExtractor.ioError(new RuntimeException(notIOError))).isFalse(); }