如何处理不知道Ruby中的库方法可以引发什么exception?
这是一个广泛的问题,但在Ruby编程时我会继续遇到这个问题。 我来自一个很大程度上是C和Java的背景,当我使用库函数或方法时,我会查看文档并查看错误返回的内容(通常在C中)或者它可以抛出的exception(在Java中)。
在Ruby中,情况似乎完全不同。 刚才我需要解析从服务器收到的一些JSON:
data = JSON.parse(response)
当然,在编写这段代码后我想到的第一件事就是如果输入不好怎么办? parse
是否会在出错时返回nil,或者引发一些exception,如果是,那么哪些?
我查看文档( http://flori.github.com/json/doc/JSON.html#M000022 ),看看,简单地说:
“将JSON字符串源解析为Ruby数据结构并将其返回。”
这只是我在Ruby中反复遇到的模式的一个例子。 最初,我认为这是我正在使用的任何库的文档的一些缺点,但现在我开始觉得这是标准的做法,我的思维方式与Ruby程序员有些不同。 有一些我不知道的惯例吗?
开发商如何处理这个问题?
(是的,我确实查看了库方法的代码,并且可以了解引发了哪些exception,但我不能100%确定,如果没有记录,我会感到不舒服,依赖它。)
编辑 :看完前两个答案后,让我继续上面的JSON解析示例。
我怀疑我不应该这样做:
begin data = JSON.parse(response) raise "parse error" if data.nil? rescue Exception => e # blahblah end
因为我可以查看代码/测试并看到它似乎引发错误的ParserError
(返回nil似乎不是Ruby中的标准做法)。 我是否正确地说建议的做法是:
begin data = JSON.parse(response) rescue JSON::ParserError => e # blahblah end
…基于我通过查看代码和测试了解ParserError
的内容?
(我还编辑了示例以澄清它是我正在解析的服务器的响应。)
(是的,我确实查看了库方法的代码,并且可以了解引发了哪些exception,但我不能100%确定,如果没有记录,我会感到不舒服,依赖它。)
我建议看一下测试,因为它们会显示一些“可能的”场景以及可能会引发的内容。 不要忘记,好的测试也是文档。
我想如果没有提供文档,你必须依赖这样的事情:
begin # code goes here rescue # fail reason is in $! end
您是否要丢弃无效的JSON数据:
begin res = JSON.parse(string) rescue JSON::ParserError => e # string was not valid end
你永远不能确定可以引发什么exception,除非库代码捕获所有exception然后包装它们。 您最好的选择是通过清理进入的代码来从代码中获得良好的输入,然后使用您自己的更高级别的exception处理来捕获输入中的错误输入。