2012-07-05 138 views
1

我试图在Ruby中使用AWS开发工具包获取存储桶,并尝试捕获NoSuchBucket错误。问题是,我的救援块没有捕捉到错误,所以我的应用崩溃了。下面是相关代码:AWS S3 NoSuchBucket异常未纳入救援条款

begin 
    b = s3.buckets[bucket_name] 

rescue AWS::S3::Errors::NoSuchBucket 
    puts Invalid bucket name. 
    exit 1 
end 

和错误消息是:

C:/Ruby193/lib/ruby/gems/1.9.1/gems/aws-sdk-1.5.6/lib/aws/core/client.rb:277:in 
`return_or_raise': The specified bucket does not exist (AWS::S3::Errors::NoSuchBucket) 

我只是做一个愚蠢的初学者语法错误,或者是有在实际上没有扔的AWS代码中的错误错误?我也尝试捕捉所有的错误,但仍然没有骰子。

回答

3
b = s3.buckets[bucket_name] 

实际上并没有提出任何请求,也不会通过例如NoSuchBucket的例外。

它只是返回一个知道它的名字是什么的桶对象。一个请求只发生在你真的试图用存储桶做某事时(列出其内容,向其中添加一个文件),并且此时NoSuchBucket被引发。这超出了您的begin区块,因此您的rescue无法处理它。如果您需要抢救该例外情况,则需要将您的开始/营救置于您实际使用水桶的地点周围。

如果你只是想验证它确实存在,你可以做类似

s3.buckets[bucket_name].exists? 
+0

刚一说明,在'.exists?'没有工作。无论是使用'[]'抓取桶还是'[]'来抓取桶中的对象都抛出错误,只尝试写入对象。感谢您确认错误实际发生的位置。 – cliclcly 2012-07-05 21:11:07

+1

。是否存在?捕获错误并返回true/false – 2012-07-05 21:11:41