@SuppressWarnings("ThrowableInstanceNeverThrown")
  public static IOException translateException(String operation, String path,
      AmazonClientException exception) {
    String message = String.format("%s%s: %s", operation, path != null ? (" on "
        + path) : "", exception);
    if (!(exception instanceof AmazonServiceException)) {
      if (containsInterruptedException(exception)) {
        return (IOException) new InterruptedIOException(message).initCause(exception);
      }
      return new COSClientIOException(message, exception);
    } else {

      IOException ioe;
      AmazonServiceException ase = (AmazonServiceException) exception;
      // this exception is non-null if the service exception is an COS one
      AmazonS3Exception s3Exception = ase instanceof AmazonS3Exception ? (AmazonS3Exception) ase
          : null;
      int status = ase.getStatusCode();
      switch (status) {

        case 301:
          if (s3Exception != null) {
            if (s3Exception.getAdditionalDetails() != null
                && s3Exception.getAdditionalDetails().containsKey(ENDPOINT_KEY)) {
              message = String.format(
                  "Received permanent redirect response to "
                      + "endpoint %s.  This likely indicates that the COS endpoint "
                      + "configured in %s does not match the region containing "
                      + "the bucket.",
                  s3Exception.getAdditionalDetails().get(ENDPOINT_KEY), ENDPOINT_URL);
            }
            ioe = new COSIOException(message, s3Exception);
          } else {
            ioe = new COSServiceIOException(message, ase);
          }
          break;
        // permissions
        case 401:
        case 403:
          ioe = new AccessDeniedException(path, null, message);
          ioe.initCause(ase);
          break;

        // the object isn't there
        case 404:
        case 410:
          ioe = new FileNotFoundException(message);
          ioe.initCause(ase);
          break;

        // out of range. This may happen if an object is overwritten with
        // a shorter one while it is being read.
        case 416:
          ioe = new EOFException(message);
          break;

        default:
          // no specific exit code. Choose an IOE subclass based on the class
          // of the caught exception
          ioe = s3Exception != null ? new COSIOException(message, s3Exception)
              : new COSServiceIOException(message, ase);
          break;
      }
      return ioe;
    }
  }
@ SuppressWarnings ( "ThrowableInstanceNeverThrown" ) public static IOException translateException ( String operation , String path , AmazonClientException exception ) { String message = String . format ( "%s%s: %s" , operation , path != null ? ( " on " + path ) : "" , exception ) ; if ( ! ( exception instanceof AmazonServiceException ) ) { if ( containsInterruptedException ( exception ) ) { return ( IOException ) new InterruptedIOException ( message ) . initCause ( exception ) ; } return new COSClientIOException ( message , exception ) ; } else { IOException ioe ; AmazonServiceException ase = ( AmazonServiceException ) exception ; AmazonS3Exception s3Exception = ase instanceof AmazonS3Exception ? ( AmazonS3Exception ) ase : null ; int status = ase . getStatusCode ( ) ; switch ( status ) { case 301 : if ( s3Exception != null ) { if ( s3Exception . getAdditionalDetails ( ) != null && s3Exception . getAdditionalDetails ( ) . containsKey ( ENDPOINT_KEY ) ) { message = String . format ( "Received permanent redirect response to " + "endpoint %s.  This likely indicates that the COS endpoint " + "configured in %s does not match the region containing " + "the bucket." , s3Exception . getAdditionalDetails ( ) . get ( ENDPOINT_KEY ) , ENDPOINT_URL ) ; } ioe = new COSIOException ( message , s3Exception ) ; } else { ioe = new COSServiceIOException ( message , ase ) ; } break ; case 401 : case 403 : ioe = new AccessDeniedException ( path , null , message ) ; ioe . initCause ( ase ) ; break ; case 404 : case 410 : ioe = new FileNotFoundException ( message ) ; ioe . initCause ( ase ) ; break ; case 416 : ioe = new EOFException ( message ) ; break ; default : ioe = s3Exception != null ? new COSIOException ( message , s3Exception ) : new COSServiceIOException ( message , ase ) ; break ; } return ioe ; } }
Translate an exception raised in an operation into an IOException. The
specific type of IOException depends on the class of
{@link AmazonClientException} passed in, and any status codes included in
the operation. That is: HTTP error codes are examined and can be used to
build a more specific response.

@param operation operation
@param path path operated on (may be null)
@param exception amazon exception raised
@return an IOE which wraps the caught exception