【问题标题】:Cannot catch AWS S3 exception无法捕获 AWS S3 异常
【发布时间】:2016-01-11 20:55:42
【问题描述】:

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

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

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

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

[2015 年 10 月 13 日星期二 23:03:32] [错误] [客户端 54.225.205.152] PHP 警告:filesize():stat failed for s3://mybucket/myfile.jpg in /var/www/api-第 278 行的 dev/awsFunc.php

[2015 年 10 月 13 日星期二 23:03:32] [错误] [客户端 54.225.205.152] PHP 致命错误:未捕获的 Aws\S3\Exception\NoSuchKeyException:AWS 错误代码:NoSuchKey,状态代码:404,AWS 请求 ID :4A6F1372301D02F7,AWS 错误类型:客户端,AWS 错误消息:指定的密钥不存在。,用户代理:aws-sdk-php2/2.8.21 Guzzle/3.9.3 curl/7.22.0 PHP/5.3.10- 1ubuntu3.19\n 在第 91 行的 /var/www/vendor/aws/aws-sdk-php/src/Aws/Common/Exception/NamespaceExceptionFactory.php 中抛出

因此,尽管我明确尝试捕获 Aws\S3\Exception\NoSuchKeyException,但系统还是会抛出它。

更新:

我发现了错误。异常命名空间应该以“\”而不是 Aws 开头,如下所示:

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

我不知道为什么当我 use 命名空间时,命名空间不以“\”开头,但在例外情况下它需要它。我想请人解释一下。

【问题讨论】:

  • 我不认为它是重复的,上面问题中的答案建议使用我已经在使用的,但没有捕获到异常

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是正确的方法。 ?

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

    【讨论】:

    • 谢谢。你知道为什么在使用use时,命名空间不需要在全局范围内用斜杠声明,而在catch内部却需要前导斜杠吗?
    • 也许你没有在use 行中正确声明命名空间。如果你这样做了,catch 中的前导斜杠就不需要了。我的例子没有它。阅读此answer 也许它可以帮助你。 ;)
    【解决方案3】:

    好的,这对我有用:

    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();
     }
    

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2021-09-17
      • 2021-10-03
      • 2018-02-04
      • 2018-02-04
      相关资源
      最近更新 更多