我是新来的Ruby,所以我有一些无法理解我在这个奇怪的异常问题。我正在使用ruby-aaws gem访问Amazon ECS:http://www.caliban.org/ruby/ruby-aws/。这定义一个类亚马逊的AWS :::错误:红宝石例外的继承与动态生成的类
module Amazon
module AWS
# All dynamically generated exceptions occur within this namespace.
#
module Error
# An exception generator class.
#
class AWSError
attr_reader :exception
def initialize(xml)
err_class = xml.elements['Code'].text.sub(/^AWS.*\./, '')
err_msg = xml.elements['Message'].text
unless Amazon::AWS::Error.const_defined?(err_class)
Amazon::AWS::Error.const_set(err_class,
Class.new(StandardError))
end
ex_class = Amazon::AWS::Error.const_get(err_class)
@exception = ex_class.new(err_msg)
end
end
end
end
end
这意味着,如果你得到一个错误代码像AWS.InvalidParameterValue
,这将产生(在它的异常变量)一类新的Amazon::AWS::Error::InvalidParameterValue
这是StandardError
一个子类。
现在这里的地方会很奇怪。我有一些代码,看起来像这样:
begin
do_aws_stuff
rescue Amazon::AWS::Error => error
puts "Got an AWS error"
end
现在,如果do_aws_stuff
抛出一个NameError
,我的救援块被触发。看来,亚马逊:: AWS ::错误不是生成的错误的超类 - 我想因为它是一个模块,一切都是它的一个子类?当然,如果我做的:
irb(main):007:0> NameError.new.kind_of?(Amazon::AWS::Error)
=> true
它说true
,我觉得这混乱的,特别是考虑到这一点:
irb(main):009:0> NameError.new.kind_of?(Amazon::AWS)
=> false
这是怎么回事,怎么我应该从其他类型的分离出来AWS的错误错误?我应该这样做:
begin
do_aws_stuff
rescue => error
if error.class.to_s =~ /^Amazon::AWS::Error/
puts "Got an AWS error"
else
raise error
end
end
这似乎格外junky。抛出的错误是不是类AWSError要么 - 他们提出这样的:
error = Amazon::AWS::Error::AWSError.new(xml)
raise error.exception
所以我期待rescue
例外是从生成的异常类型,只有从StandardError的继承。
为了澄清,我有两个问题:
为什么NameError,一个Ruby内置的例外,一个
kind_of?(Amazon::AWS::Error)
,这是一个模块?
答:我曾在我的文件的开头说:include Amazon::AWS::Error
,认为它是一种类似于Java进口或C++包括。实际上做的是将Amazon::AWS::Error
(现在和将来)中定义的所有内容添加到隐式Kernel类,这是每个类的祖先。这意味着什么将通过kind_of?(Amazon::AWS::Error)
。我怎样才能最好的从随机其他异常从别处区分
Amazon::AWS::Error
动态创建的异常?
由于Amazon :: AWS :: Error类型似乎与您在问题顶部提供的源代码无关,因此很难理解您的问题。粘贴错误,也许? – 2008-09-16 07:32:57
糟糕,我忘了“AWS”模块。我剪掉了文件中很多不相关的部分,并且必须忽略它。所以我们有一个亚马逊模块,一个AWS模块,一个错误模块,然后是一个AWSError类,它在Amazon :: AWS :: Error模块中设置常量。 – bhollis 2008-09-16 07:48:02