我是新來的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