s3client new example composer aws amazon-web-services amazon-s3

amazon-web-services - example - new s3client



Manejo de errores en AWS PHP SDK 2 (3)

Si trato de obtener un objeto de mi cubo S3 que no existe, Amazon PHP SDK 2 me da un error bastante feo. Práctico para mí, pero no significa nada para el usuario final ...

P.ej:

$s3 = $aws->get(''s3''); $result = $s3->getObject(array( ''Bucket'' => ''my bucket'', ''Key'' => ''path/to/file'' ));

El error:

Error grave: Aws / S3 / Exception / NoSuchKeyException no detectada: código de error de AWS: NoSuchKey, código de estado: 404, AWS ID de solicitud: xxxxxxxxxxxxx, tipo de error de AWS: cliente, mensaje de error de AWS: la clave especificada no existe. lanzado en AWS / vendor / aws / aws-sdk-php / src / Aws / Common / Exception / NamespaceExceptionFactory.php en la línea 89

¿Hay alguna manera de poder determinar si hay un error e imprimir un mensaje que tenga sentido en lugar de lo anterior?


De repente se me ocurrió intentar esto:

try { $result = $s3->getObject(array( ''Bucket'' => ''my bucket'', ''Key'' => ''path/to/file'' )); } catch (Exception $e) { // I can put a nicer error message here }


Todos los errores que se producen en llamadas a métodos del AWS SDK se indican lanzando excepciones. Puede capturar esas excepciones si quiere manejar los errores.

En el caso más simple, es posible que desee atrapar Exception :

try { $result = $s3->getObject(array( ''Bucket'' => ''my bucket'', ''Key'' => ''path/to/file'' )); } catch (Exception $e) { echo ''Oops, something went wrong''; }

Sin embargo, si solo quiere manejar ciertas excepciones esperadas, mientras deja que otros salgan disparados y bloquee su aplicación, entonces las cosas se vuelven un poco más sutiles.

En primer lugar, cada una de las pocas docenas de espacios de nombres dentro del espacio de nombres de AWS contiene un espacio de nombres de Exception en el que define clases de excepción. Una de estas clases en cada espacio de nombres es lo que Amazon llama a la clase de excepción de servicio predeterminada para el espacio de nombres, del cual todas las demás excepciones heredan.

Por ejemplo, S3 tiene el espacio de nombres Aws/S3/Exception y la clase S3Exception . EC2 tiene el espacio de nombres Aws/Ec2/Exception y la clase Ec2Exception .

Tenga en cuenta que la captura de una de estas excepciones en lugar de la clase base Exception inmediatamente nos detiene la captura de ciertos errores! Las excepciones específicas del servicio se lanzan como resultado de respuestas de error del servidor; Las excepciones de falla de conexión no heredan de ellas. Por ejemplo, si intenta ejecutar el siguiente código sin una conexión a Internet ...

try { $result = $s3->getObject(array( ''Bucket'' => ''my bucket'', ''Key'' => ''path/to/file'' )); } catch (S3Exception $e) { echo ''Oops, something went wrong''; }

... entonces no se Guzzle/Http/Exception/CurlException la excepción (ya que será una Guzzle/Http/Exception/CurlException , no una S3Exception) y el programa fallará. Por esta razón, si está detectando estas excepciones solo para proporcionar mensajes de falla genéricos al usuario, probablemente debería atrapar Exception .

Volvamos a la cuestión de cómo manejar un error específico . Para la mayoría de los espacios de nombres, la respuesta es que habrá una clase de excepción definida para ese error, y usted debería atrapar eso. Por ejemplo, digamos que estamos usando nuevamente el método S3 getObject y queremos hacer algo cuando el segmento que pedimos no existe. Al NoSuchBucketException en los documentos del espacio de nombres de la Excepción S3 , vemos que hay una NoSuchBucketException que podemos detectar:

try { $result = $s3->getObject(array( ''Bucket'' => ''my bucket'', ''Key'' => ''path/to/file'' )); } catch (NoSuchBucketException $e) { echo ''There is no such bucket.''; }

(En la práctica, puede ser más fácil determinar qué excepciones pueden arrojarse mediante operaciones de prueba y error que leyendo cuidadosamente los documentos).

Finalmente, vale la pena mencionar la API EC2. A diferencia de todos los otros servicios, el espacio de nombres EC2 incluye solo una única clase de excepción, Ec2Exception . Si desea detectar y manejar un error específico, debe inspeccionar el objeto de excepción para descubrir qué tipo de error está tratando. Puede hacerlo comprobando el valor devuelto por el método getExceptionCode() de la excepción.

Por ejemplo, un fragmento (modificado) de una secuencia de comandos que escribí recientemente que otorga acceso de direcciones IP específicas a nuestro servidor MySQL:

try { $result = $ec2->authorizeSecurityGroupIngress([ ''GroupName'' => ''mygroup'', ''IpProtocol'' => ''tcp'', ''ToPort'' => 3306, ''CidrIp'' => $ip . "/32", ]); } catch (Ec2Exception $e) { if ($e->getExceptionCode() == ''InvalidPermission.Duplicate'') { echo "IP already has requested permission."; } else { // Don''t know how to deal with this error; let''s crash throw $e; } }

Tenga en cuenta que los posibles códigos de excepción, como InvalidPermission.Duplicate en este caso, no figuran en la documentación de AWS PHP SDK, pero puede encontrarlos por prueba y error o en la documentación de la API de EC2 , en la que cada página de acción de API contiene una sección de ''Errores'' que enumera los códigos de error que puede devolver.


También puede usar este método: $response = $s3->doesObjectExist( $bucket, $key );

Devolverá una respuesta verdadera booleana si el objeto existe.

AWS Docs para doesObjectExist