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

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

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

为了测试它,我为请求输入了一个虚假的域名,但我没有得到HTTParty :: ResponseErrorexception,而是得到了一个SocketErrorexception。

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

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

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

一般来说(我不是ruby程序员)我使用以下方法。

我通过以下方式处理exception:

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

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

  • 无法处理吗? 所有未处理的例外情况应在最高级别进行,并且(a)报告,(b)确保系统保持稳定和一致。 无论其他两个是否完成,这都应该始终存在。

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

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

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

这里的问题不是你捕获错误的exception,而是你用错误的数据启动测试。

最好的行动方案是了解可能发生的exception并管理它们。当我说理解时,我会到达 – URL来自何处,是否由您的用户输入? 如果是这样, 永远不要相信它并抓住一切 它来自您的配置数据; 半信任它并记录错误,除非URL是正常的关键任务。

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

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

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