如何处理不知道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处理来捕获输入中的错误输入。