我想要一个将在yaml文件中加载和保存设置的类,如果发生某些事情,则会显示错误。我必须抓住异常,我必须知道要抓到什么。无法保证会引发什么异常;用户可能按CTRL + C或内存可能用完,但YAML.load_file
只能引发有限数量的异常。没有列出函数YAML.load_file
可能引发的异常。
当我不知道这些例外是什么时,我怎么能只抓住它们?
这个问题已被提出,但没有真正的答案:
答案 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