无法捕获AWS S3异常

时间:2015-10-13 22:57:39

标签: php amazon-web-services amazon-s3 exception-handling

我正在尝试使用Stream API使用以下代码获取S3对象的文件大小:

try{
    $fileSize = filesize("s3://".$bucket."/".$filename);
}catch(Aws\S3\Exception\NoSuchKeyException $e) {
    return false;
}

如果密钥不存在,我会收到以下错误:

  

[Tue Oct 13 23:03:32 2015] [错误] [客户端54.225.205.152] PHP警告:找不到文件或目录:/ var / www / vendor / aws中的s3://mybucket/myfile.jpg第774行的/aws-sdk-php/src/Aws/S3/StreamWrapper.php

     

[Tue Oct 13 23:03:32 2015] [错误] [客户端54.225.205.152] PHP警告:filesize():对于/ var / www / api-中的s3://mybucket/myfile.jpg,stat失败第278行的dev / awsFunc.php

     

[Tue Oct 13 23:03:32 2015] [error] [client 54.225.205.152] PHP致命错误:未捕获的Aws \ S3 \ Exception \ NoSuchKeyException:AWS错误代码:NoSuchKey,状态代码:404,AWS Request ID :4A6F1372301D02F7,AWS错误类型:客户端,AWS错误消息:指定的密钥不存在。,User-Agent:aws-sdk-php2 / 2.8.21 Guzzle / 3.9.3 curl / 7.22.0 PHP / 5.3.10-第91行的/var/www/vendor/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php中引用了1ubuntu3.19 \ n

所以,虽然我明确地尝试捕获Aws \ S3 \ Exception \ NoSuchKeyException,但系统仍会抛出它。

更新

我发现了错误。命名空间应该以'\'而不是Aws开头,例如:

try{
    $fileSize = filesize("s3://".$bucket."/".$filename);
}catch(\Aws\S3\Exception\NoSuchKeyException $e) {
    return false;
}

我不知道为什么当我use命名空间时,命名空间不以'\'开头,但在异常中它需要它。我希望有人解释。

3 个答案:

答案 0 :(得分:7)

好的,这就是对我有用的东西:

use Aws\S3\Exception\S3Exception as S3;


try {
    $podcast = $this->uploadFileToS3($request);
} catch(S3 $e) {
    return $e->getMessage();
 }

在我的情况下,我将消息传递给会话闪存,如下所示:

 return redirect('dashboard/episode/create')->with('status', $e->getMessage());

所以这一切都取决于你想如何使用它。

try {
    $fileSize = filesize("s3://".$bucket."/".$filename);
} catch(S3 $e) {
    return $e->getMessage();
 }

祝你好运!

答案 1 :(得分:2)

这是正确的方法。

use Aws\Exception\AwsException;

try{
    // something
}catch(AwsException $e){
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

答案 2 :(得分:1)

您可以使用AWSExceptiongetAwsErrorMessage()方法 所以你可以做

use Aws\S3\Exception\S3Exception;
 try {
     // Your Code       
 } catch (S3Exception $e) {
     return $e->getAwsErrorMessage();
 }