如何知道救援的例外情况

时间:2015-12-23 20:42:52

标签: ruby exception

我想要一个将在yaml文件中加载和保存设置的类,如果发生某些事情,则会显示错误。我必须抓住异常,我必须知道要抓到什么。无法保证会引发什么异常;用户可能按CTRL + C或内存可能用完,但YAML.load_file只能引发有限数量的异常。没有列出函数YAML.load_file可能引发的异常。

当我不知道这些例外是什么时,我怎么能只抓住它们?

这个问题已被提出,但没有真正的答案:

3 个答案:

答案 0 :(得分:2)

有时您只是不知道可以抛出哪种异常,因为存在通用的$(function(){ $("a.ajaxLink").click(function(e){ e.preventDefault(); // prevent the default click behaviour var _this=$(this); var myUrl=_this.attr("href"); myUrl+="?name="+_this.data("name"); myUrl+="&reportItemId="+_this.data("reportitemid"); myUrl+="&MimeType="+_this.data("mime"); alert(myUrl); $.post(myUrl,function(response){ //do something with the response // reload to some other page // window.location.href="@Url.Action("ReportListing","Report")"; }); }); }); 捕获。

rescue

答案 1 :(得分:2)

  

当我不知道这些例外是什么时,我怎么能只抓住它们?

我想知道你抓到它们后要做什么?为了捕获而捕获异常几乎没有意义。吞咽异常是特别糟糕的做法。

我的经验法则是:只抓住那些我可以恢复的东西(这意味着已经知道它们是什么)。让其余部分冒泡并使程序崩溃,或者可能陷入其中一个外部范围(这将知道如何从这个具体的范围中恢复)。

如何发现当前加载的异常类

This almost 10 year old code snippet今天仍有效:

exceptions = []
tree = {}
ObjectSpace.each_object(Class) do |cls|
  next unless cls.ancestors.include? Exception
  next if exceptions.include? cls
  exceptions << cls
  cls.ancestors.delete_if {|e| [Object, Kernel].include? e }.reverse.inject(tree) {|memo,cls| memo[cls] ||= {}}
end

indent = 0
tree_printer = Proc.new do |t|
  t.keys.sort { |c1,c2| c1.name <=> c2.name }.each do |k|
    space = (' ' * indent); space ||= ''
    puts space + k.to_s
    indent += 2; tree_printer.call t[k]; indent -= 2
  end
end
tree_printer.call tree

在rails控制台中运行它,你会看到很多异常类。 :)

答案 2 :(得分:-2)

  

源代码是文档。

     

- Matz