Je suis nouveau à Ruby, donc j'ai du mal à comprendre ce problème d'exception bizarre que j'ai. J'utilise la gemme ruby-aaws pour accéder à Amazon ECS: http://www.caliban.org/ruby/ruby-aws/. Ceci définit une classe Amazon :: AWS: Erreur:Ruby exception inheritance avec des classes générées dynamiquement
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
Cela signifie que si vous obtenez un code d'erreur comme AWS.InvalidParameterValue
, cela produira (dans sa variable d'exception) une nouvelle classe Amazon::AWS::Error::InvalidParameterValue
qui est une sous-classe de StandardError
.
Maintenant, c'est ici que ça devient bizarre. J'ai un code qui ressemble à ceci:
begin
do_aws_stuff
rescue Amazon::AWS::Error => error
puts "Got an AWS error"
end
Maintenant, si do_aws_stuff
jette une NameError
, mon bloc de secours se déclenche. Il semble que Amazon :: AWS :: Error n'est pas la superclasse de l'erreur générée - je suppose que c'est un module tout est une sous-classe de celui-ci? Certes, si je fais:
irb(main):007:0> NameError.new.kind_of?(Amazon::AWS::Error)
=> true
Il dit true
, que je trouve confus, compte tenu surtout:
irb(main):009:0> NameError.new.kind_of?(Amazon::AWS)
=> false
Qu'est-ce qui se passe, et comment suis-je censé séparer les erreurs AWS d'autres types de les erreurs? Dois-je faire quelque chose comme:
begin
do_aws_stuff
rescue => error
if error.class.to_s =~ /^Amazon::AWS::Error/
puts "Got an AWS error"
else
raise error
end
end
Cela semble exceptionnellement mignon. Les erreurs ne sont pas jetés classe AWSError soit - ils sont élevés comme ceci:
error = Amazon::AWS::Error::AWSError.new(xml)
raise error.exception
Ainsi, les exceptions que je cherche à rescue
de sont les types d'exception générés héritant seulement de StandardError.
Pour clarifier, j'ai deux questions:
Pourquoi NameError, Ruby construit en exception, un
kind_of?(Amazon::AWS::Error)
, qui est un module?
Réponse: J'avais ditinclude Amazon::AWS::Error
en haut de mon fichier, pensant que c'était un peu comme une importation Java ou C++ include. Qu'est-ce que cela a réellement fait était d'ajouter tout ce qui est défini dansAmazon::AWS::Error
(présent et futur) à la classe noyau implicite, qui est un ancêtre de chaque classe. Cela signifie que tout passeraitkind_of?(Amazon::AWS::Error)
. Comment puis-je distinguer au mieux les exceptions créées dynamiquement dansAmazon::AWS::Error
d'autres exceptions aléatoires d'ailleurs?
Il est difficile de donner un sens à votre question, car le type Amazon :: AWS :: Error ne semble pas être lié au code source que vous fournissez en haut de la question. Erreur de collage, peut-être? –
Oups, j'ai oublié le module "AWS". Je découpais beaucoup de parties non pertinentes du fichier et je dois le manquer. Nous avons donc un module Amazon, puis un module AWS, puis un module Error, puis une classe AWSError, qui définit des constantes dans le module Amazon :: AWS :: Error. – bhollis