2012-07-25 29 views
3

我经常发现自己不知道在Ruby中使用特定的代码库时会发生什么异常。如何知道要解救的例外情况?

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

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

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

我可以通过拯救“异常”来解决这个问题,但这是非常糟糕的做法。我宁愿意识到我可能造成的例外情况,并处理这些例外情况。

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

+1

*为什么*你想拯救异常?如果一个程序抛出它们,你打算做什么来使持续处理有用? – 2012-07-25 01:51:38

回答

0

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

处理这个问题的最好方法是在测试中使用一个有错误URL的有效域,但在您的实时代码中捕获到socketError。

这里的问题并不是你正在捕捉错误的异常,而是你正在用不良数据启动测试。

最好的行动方式是了解可以发生什么异常并对其进行管理, 当我说明白时,我就会知道 - URL是从哪里来的,是由用户输入的?如果是的话从来没有信任它,抓住一切。它是否来自你的配置数据;半信任它并记录错误,除非它的URL是好的关键任务。

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

编辑:我在这里试图做的是倡导程序员的思维方式,以了解他们的行为结果。我们都知道试图连接到'thisServiceIsTotallyBogus.somethingbad.notAvalidDomain'将会失败;但程序员的思维模式应该首先验证域名来自哪里。如果由用户输入,则必须进行全面检查;如果您知道它来自只能由您或您的支持团队访问的配置文件;你可以放松一点;可悲的是,这是一个糟糕的例子,你应该经常测试URLS,因为有时互联网不工作!

理想情况下,您使用的任何开发人员文档都应告诉您可能抛出哪些异常。

+0

在这种情况下,请求在我的控制之下。我想模拟如果服务器停机会发生什么。如果我的确将服务器关闭,我也会遇到套接字错误,因为域中没有任何东西可以接收请求并作出响应。 – Brian 2012-07-25 02:55:11

6

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

我处理以下列方式例外:

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

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

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

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

+0

关于你的第四种情况;它不会是一个例外,如果你不能处理/抓住它。如果你看到我的意思,那么试图营救那些无法营救的人是没有意义的。我的精神是,例外应该是例外,而不是程序流程的人为因素; IE:期待例外。 – 2012-07-25 02:01:29

+0

这是一个很好的方法,谢谢。 – Brian 2012-07-25 02:58:06

+0

@RussC:我不知道我理解你。我的第四点是关于你无法捕捉的。但是,在这种情况下,您可能需要恢复(补偿?)状态。因此我的记录评论。 – 2012-07-25 05:30:15

相关问题