2017-01-31 14 views
1

これは実際には3つの質問です。Psych Yamlの例外を救う方法は?

  1. Psychが例外として挙げるものは何ですか?
  2. 文書化しても問題がない場合は、どのようなものなのか、どのように知っていますか?
  3. 可能なすべてのYAML.load_file例外をキャッチするサンプルコード?

ノー3を求めるないだろうが、この質問を示唆私は奇妙な問題が発生します。この質問 How to know what exceptions to rescue

に基づいて Can't rescue YAML.load exception

を私が得た:

Psych::Exception 
     Psych::BadAlias 
     Psych::DisallowedClass 
     Psych::SyntaxError 

しかし、私がそのコードをキャッチしようとすると、まだ失敗する

irb(main):002:0> begin 
irb(main):003:1* YAML.load_file('test_file_does_not_exist') 
irb(main):004:1> rescue Psych::Exception 
irb(main):005:1> puts $!.message 
irb(main):006:1> end 
Errno::ENOENT: No such file or directory @ rb_sysopen - test 
    from /home/marko/.gem/ruby/2.3.1/gems/psych-2.1.0/lib/psych.rb:474:in `initialize' 
    from /home/marko/.gem/ruby/2.3.1/gems/psych-2.1.0/lib/psych.rb:474:in `open' 
    from /home/marko/.gem/ruby/2.3.1/gems/psych-2.1.0/lib/psych.rb:474:in `load_file' 
    from (irb):3 
    from /home/marko/.rubies/ruby-2.3.1/bin/irb:11:in `<main>' 

私はすべてのナンセンスをキャッチする方法を探しています。障害の理由にかかわらず、私はそれを捕まえて、主要な例外処理コードに落ちる前にメッセージを表示したいと思う。

私が特に気に入らないマイクロソフトでは、これまでに書いたすべてのクラスのすべての例外を示しています。例:チェックする https://msdn.microsoft.com/en-us/library/b9skfh7s(v=vs.110).aspx

答えて

2

サイコ例外

一つの方法は、次のようになります。

exceptions_before = ObjectSpace.each_object(Class).select{|klass| klass < Exception} 
require 'yaml' 
exceptions_after = ObjectSpace.each_object(Class).select{|klass| klass < Exception} 

それは、動的に生成される例外を欠場することがあります。それでも、ここでは2の違いだ、と彼らの祖先:

(exceptions_after - exceptions_before).each do |yaml_exception| 
    p yaml_exception.ancestors 
end 

# [Psych::SyntaxError, Psych::Exception, RuntimeError, StandardError, Exception, Object, Kernel, BasicObject] 
# [Psych::DisallowedClass, Psych::Exception, RuntimeError, StandardError, Exception, Object, Kernel, BasicObject] 
# [Psych::BadAlias, Psych::Exception, RuntimeError, StandardError, Exception, Object, Kernel, BasicObject] 
# [Psych::Exception, RuntimeError, StandardError, Exception, Object, Kernel, BasicObject] 
# [StringScanner::Error, StandardError, Exception, Object, Kernel, BasicObject] 

Psych::ExceptionStringScanner::ErrorPsychによってスローされるすべての例外をカバーしているようです。

その他の例外

どこでも問題が起こる可能性があります。それでも、最も一般的な例外は次のようになります。

Errno::ENOENT 

あなた.ymlが見つからない場合。あなたは例外を救済するか、yamlファイルを読む前にFile.exist?をチェックすることができます。

IMHO、あなたはすべての例外を救済しようとしないでください。

rescue => e、またはrescue Exception => eを探しているように見えますが、それはnot a good ideaです。

+0

質問を編集しようとしています –

+0

存在しない 'YAML.load_file'があった場合、ERRNO :: SOMETHINGはどうなりますか? –

+0

ファイル名文字列の引用符を閉じないと、sytaxエラーはどうなりますか? :)基本的に何かがファイルを読み込む間に間違って行くことができます。私はPsych特有の例外を指しているとしてその問題を理解しました。 –

関連する問題