Rubyの例外承継に動的に生成されたクラス
-
09-06-2019 - |
質問
私は新しいルビー、なんかトラブルを理解するかの例外を問題なった。僕のruby-aaws逸品へのアクセスAmazon ECS: http://www.caliban.org/ruby/ruby-aws/.このクラスアマゾン::ドキュメントのイベント:Error:
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
こだerrorcodeのように 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
, 私の救済のブロックがトリガされます。このアマゾン::ドキュメントのイベント::Errorを発生さんのスーパークラスの発生するエラーからのモジュールはサブクラスすることはできるのでしょうか?確かばん:
irb(main):007:0> NameError.new.kind_of?(Amazon::AWS::Error)
=> true
という true
, から干の混乱をもたらすでしょうが、特にこうした:
irb(main):009:0> NameError.new.kind_of?(Amazon::AWS)
=> false
今後、どうかの別ドキュメントのイベントの誤差からその他のタイプのエラー?きましたようなもの:
begin
do_aws_stuff
rescue => error
if error.class.to_s =~ /^Amazon::AWS::Error/
puts "Got an AWS error"
else
raise error
end
end
そうな非常にjanky.エラーをスローされないクラスAWSErrorで作られてい上げのようになります:
error = Amazon::AWS::Error::AWSError.new( xml )
raise error.exception
その例外を探している rescue
からの発生する例外タイプのみからは継承しStandardError.
明らかにしてい質問:
理由は定義がどこにも、Ruby築の例外は、
kind_of?(Amazon::AWS::Error)
, であるモジュール?
回答: あったかいinclude Amazon::AWS::Error
上のファイル、まったようJavaの輸入またはC++が含まれています。こうした追加もで定義されAmazon::AWS::Error
(現在-未来)の暗黙のカーネルのクラスは、上位クラスのクラスです。この意味 何 というkind_of?(Amazon::AWS::Error)
.たいのですがベストを識別する動的に作成された例外
Amazon::AWS::Error
からランダムなどの例外ですから?
解決
Okんを支援していきま
最初のモジュールではないクラスでできるミックスの振る舞いができます。第二に、以下の例:
module A
module B
module Error
def foobar
puts "foo"
end
end
end
end
class StandardError
include A::B::Error
end
StandardError.new.kind_of?(A::B::Error)
StandardError.new.kind_of?(A::B)
StandardError.included_modules #=> [A::B::Error,Kernel]
kind_of?分かるのがあり、エラーが持つすべてのA:B::エラー行動については通常ていA:B::Errorを発生しないすべての行動から::Bをおこなっておりませんので、A:B種類。(鴨タイピング)
現在はそれだけではありません非常に良い機会になることruby-ドキュメントのイベント館のスーパークラスの定義がどこにも、アマゾン::ドキュメントのイベント:エラーあります。(猿パッチング)
また、このサイトではprogramaticallyのモジュールが含まれているとの階層は、以下の
class Class
def has_module?(module_ref)
if self.included_modules.include?(module_ref) and not self.superclass.included_modules.include?(module_ref)
puts self.name+" has module "+ module_ref.name
else
self.superclass.nil? ? false : self.superclass.has_module?(module_ref)
end
end
end
StandardError.has_module?(A::B::Error)
NameError.has_module?(A::B::Error)
に関する第二の問題が見えないことに気づいたものより
begin
#do AWS error prone stuff
rescue Exception => e
if Amazon::AWS::Error.constants.include?(e.class.name)
#awsError
else
whatever
end
end
編集--上記のコードな作業としては:名モジュールの接頭辞がない場合の定数をarrays.ぜお、libのmaintainerのAWSErrorクラス。ファクトリクラスのロードいて:/)
思っていたルビー-ドキュメントのイベントのcalibanサイトによって視界が遮られ、当社のファイアウォールな試験ります。
について:というものをやってい猿継ぎのStandardError上位の階層となります。いうものが、そのrootファイル以外は毎のコンテキストを含むモジュールオブジェクトのオブジェクト形式のメタクラス.(このような出来事が起きないようにと、IRB、デフォルトのコンテキストオブジェクトからないのでファイル)
から 嘴モジュール :
A couple of points about the include statement before we go on. First, it has nothing to do with files. C programmers use a preprocessor directive called #include to insert the contents of one file into another during compilation. The Ruby include statement simply makes a reference to a named module. If that module is in a separate file, you must use require to drag that file in before using include.
編集--いることもできるでしょうコメントをブラウザ:/ロイヤ用ロックプラットフォーム)
他のヒント
もういいですね:
Class.new( StandardError )
は新しいクラスStandardErrorとしての基底クラスではなく、アマゾン::ドキュメントのイベント::Errorを発生させます。で定義されるモジュールはなぜですkind_of?Amazon::ドキュメントのイベント::エラーになります。しかしなkind_of?Amazon::ドキュメントのイベントでもモジュールな巣を目的kind_of??
申し訳わかんないモジュールとルビーが、ほとんどの基底クラスではStandardError.
更新:ちなみに、 からrubyのdocs:
obj.kind_of?(クラス)=>trueまたはfalse
場合にtrueを返しまクラスは、objのクラスの場合、またはクラスのスーパークラスのobj又はモジュールが含まれてobj.
<url> <url> <url> <url> <url> <url> <url> <url> <url> <url>チャイム:ここのバグはlibのコードです。でも読み:
unless Amazon::AWS::Error.const_defined?( err_class )
kls = Class.new( StandardError )
Amazon::AWS::Error.const_set(err_class, kls)
kls.include Amazon::AWS::Error
end
課題のひとつだ走る Amazon::AWS::Error::AWSError
になります。時 raise
"と呼ばれるものですが最初のパラメータに対応 exception
方法を採用していますので、その結果です。があるので、そちらもぜひラスのサブクラス Exception
戻り、なかでもイラクやシリアの exception
はできない raise Exception.new("Something is wrong")
.
この場合、 AWSError
は exception
設定した属性リーダーを定義します値に初期化さないで Amazon::AWS::Error::SOME_ERROR
.これを呼び出すときは raise Amazon::AWS::Error::AWSError.new(SOME_XML)
Rubyて、最終的に呼び出し Amazon::AWS::Error::AWSError.new(SOME_XML).exception
今のインスタンスを返しま Amazon::AWS::Error::SOME_ERROR
.からご指摘がありましたように、他の応答者に、このクラスは直接サブクラス StandardError
代わりに、クラスのサブクラス共通のアマゾンエラーになります。これまでは整流、ジャンソリューションで最高のベット。
いる説明しますのんのコンプライアンス-