9

存在しない S3 バケットからオブジェクトを取得しようとすると、Amazon PHP SDK 2 でかなり醜いエラーが表示されます。私にとっては便利ですが、エンドユーザーにとっては何の意味もありません...

例えば:

$s3 = $aws->get('s3');

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

エラー:

致命的なエラー: Uncaught Aws\S3\Exception\NoSuchKeyException: AWS エラー コード: NoSuchKey、ステータス コード: 404、AWS リクエスト ID: xxxxxxxxxxxxx、AWS エラー タイプ: クライアント、AWS エラー メッセージ: 指定されたキーは存在しません。89 行目の AWS/vendor/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php でスローされます

エラーがあるかどうかを判断し、上記ではなく意味のあるメッセージを出力する方法はありますか?

4

3 に答える 3

9

これを試してみることに突然思いつきました:

try {
    $result = $s3->getObject(array(
        'Bucket' => 'my bucket',
        'Key'    => 'path/to/file'
    ));
} catch (Exception $e) {
   // I can put a nicer error message here  
}
于 2013-04-12T10:31:25.590 に答える
6

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\CurlExceptionS3Exception ではなく であるため)、プログラムはクラッシュします。このため、一般的なエラー メッセージをユーザーに提供するためだけにこれらの例外をキャッチする場合は、おそらく をキャッチする必要があります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 アクションのページに 'エラーのセクションには、返される可能性のあるエラー コードがリストされています。

于 2014-09-07T22:52:07.410 に答える