AWS SDK のメソッドの呼び出しで発生するすべてのエラーは、例外をスローすることによって示されます。エラーを処理したい場合は、これらの例外をキャッチできます。
最も単純なケースでは、単にキャッチしたい場合がありますException
:
try {
$result = $s3->getObject(array(
'Bucket' => 'my bucket',
'Key' => 'path/to/file'
));
}
catch (Exception $e) {
echo 'Oops, something went wrong';
}
ただし、予期される特定の例外のみを処理し、他の例外が発生してアプリケーションがクラッシュするのを許容したい場合は、状況が少し複雑になります。
まず、 AWS 名前空間内の数十の名前空間のそれぞれに、Exception
例外クラスを定義する名前空間が含まれています。各名前空間のこれらのクラスの 1 つは、Amazon が名前空間のデフォルトのサービス例外クラスと呼んでいるもので、そこから他のすべての例外が継承されます。
たとえば、S3 にはAws\S3\Exception
名前空間とS3Exception
クラスがあります。EC2 にはAws\Ec2\Exception
名前空間とEc2Exception
クラスがあります。
基本クラスの代わりにこれらの例外の 1 つをキャッチException
すると、特定のエラーのキャッチがすぐに停止することに注意してください。サービス固有の例外は、サーバーからのエラー応答の結果としてスローされます。接続失敗の例外はそれらから継承されません。たとえば、インターネットに接続せずに次のコードを実行しようとすると...
try {
$result = $s3->getObject(array(
'Bucket' => 'my bucket',
'Key' => 'path/to/file'
));
}
catch (S3Exception $e) {
echo 'Oops, something went wrong';
}
... その後、例外はキャッチされず ( Guzzle\Http\Exception\CurlException
S3Exception ではなく であるため)、プログラムはクラッシュします。このため、一般的なエラー メッセージをユーザーに提供するためだけにこれらの例外をキャッチする場合は、おそらく をキャッチする必要がありますException
。
特定のエラーを処理する方法の問題に戻りましょう。ほとんどの名前空間の答えは、そのエラーに対して定義された例外クラスがあり、それをキャッチする必要があるということです。たとえば、再び S3getObject
メソッドを使用していて、要求したバケットが存在しないときに何かをしたいとします。S3 Exception 名前空間 docsを見ると、キャッチできるものがあることがわかりNoSuchBucketException
ます。
try {
$result = $s3->getObject(array(
'Bucket' => 'my bucket',
'Key' => 'path/to/file'
));
}
catch (NoSuchBucketException $e) {
echo 'There is no such bucket.';
}
(実際には、ドキュメントを注意深く読むよりも、試行錯誤を通じて、どの操作でどの例外がスローされるかを理解する方が簡単かもしれません。)
最後に、EC2 API について言及する価値があります。他のすべてのサービスとは異なり、EC2 名前空間には例外クラスが 1 つだけ含まれていEc2Exception
ます。特定のエラーをキャッチして処理する場合は、例外オブジェクトを調べて、処理しているエラーの種類を把握する必要があります。getExceptionCode()
これを行うには、例外のメソッドによって返される値を確認します。
たとえば、私が最近書いたスクリプトからの (変更された) スニペットは、指定された IP に 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;
}
}
この場合のようInvalidPermission.Duplicate
に、考えられる例外コードは AWS PHP SDK のドキュメントには記載されていませんが、試行錯誤するか、EC2 API 自体のドキュメントから見つけることができます。このドキュメントでは、各 API アクションのページに 'エラーのセクションには、返される可能性のあるエラー コードがリストされています。