如何知道救援的例外情况?

时间:2012-07-25 01:37:27

标签: ruby-on-rails ruby sinatra

在Ruby中使用特定的代码库时,我经常发现自己不知道要解救哪些异常。

例如,我经常使用HTTParty来处理我的rails / sinatra app会发出的任何HTTP请求。我挖掘了HTTParty的代码,发现了一个包含已定义的异常的文件。大!我会在提出请求时拯救他们。

为了测试它,我为请求输入了一个虚假的域名,但是我没有预期的HTTParty :: ResponseError异常,而是得到了一个SocketError异常。

处理此问题的最佳方法是什么?我知道HTTParty是Ruby实现的包装器,这可能是抛出SocketError异常的原因。但我怎么知道呢?

我可以通过拯救“异常”来解决这个问题,但这是非常糟糕的做法。我宁愿清楚我可能造成的异常和处理这些异常。

编辑:我应该澄清一下,真正促使我创建这个问题的是我不知道如何能够找出在调用特定函数时可能出现的异常...也就是说,无需查看堆栈中的每个函数调用。

3 个答案:

答案 0 :(得分:6)

一般而言(我不是红宝石程序员)我使用以下方法。

我通过以下方式处理异常:

  • 我可以从中恢复吗?如果异常可能发生,我知道我可以恢复或重试,那么我处理异常。

  • 是否需要报告?如果异常发生但我知道我无法恢复或重试,那么我通过记录它然后传递它来处理异常给来电者。我总是在自然子系统边界上执行此操作,如主要模块或服务。有时(取决于API)我可能会使用“my module”特定的异常包装异常,以便调用者只处理我的异常。

  • 无法处理?所有未处理的异常都应该在顶层捕获并且(a)报告,(b)确保系统保持稳定和一致。无论其他两个是否完成,都应该始终存在。

当然还有另一类例外 - 那些非常严重的例外,它们让你没有机会对付它们。对于这些只有一个解决方案-Post Mortem调试,我发现最好的事情是日志,日志和更多日志。在从小到大的许多系统上工作过,我宁愿牺牲性能来获得稳定性和可恢复性(除非它至关重要)并且如果可能的话,内省地添加大量的日志记录。

答案 1 :(得分:0)

如果你输入一个虚假的域名,socketError响应就完全没了问题。 毕竟 - 尝试连接到不存在的域将导致连接失败AKA SocketError。

处理这种情况的最佳方法是在测试中使用带有错误URL的有效域,但在实时代码中捕获socketError。

这里的问题不在于您是否正在捕获错误的异常,而是您正在使用错误的数据启动测试。

最好的行动方案是了解可能发生的异常并对其进行管理, 当我说明白了,我就到了 - 网址来自哪里,是否由用户输入?如果是这样从不信任它并抓住一切。它来自您的配置数据;半信任它并记录错误,除非URL的确定是关键任务。

这里没有正确或错误的答案,但我希望这种方法会给你一个好的结果。

编辑:我在这里尝试做的是提倡一个了解其行为结果的程序员的心态。我们都知道尝试连接'thisServiceIsTotallyBogus.somethingbad.notAvalidDomain'会失败;但程序员的心态应该是首先确切地确定该域的来源。如果是由用户输入,那么您必须进行全面检查;如果您知道它来自配置文件,只能由您自己或您的支持团队访问;你可以放松一下;可悲的是,这是一个糟糕的例子,因为你应该总是测试URL,因为有时互联网不起作用!

理想情况下,您使用的任何内容的开发人员文档都应该告诉您它可以抛出的异常。

答案 2 :(得分:0)

对于公开提供源代码的库或gem,通常可以在 exceptions.rb 文件中找到异常的类型。 (参考here)。否则,您将不得不依赖文档。如果所有其他方法都失败了,您可以营救StandardError,尽管在许多情况下这不是理想的做法(请参考this SO answer