如何知道抢救异常是什么?(How to know what exceptions to rescue

2019-09-20 03:32发布

我经常发现自己不知道在Ruby中使用特定的代码库时异常是什么抢救。

举例来说,我经常使用HTTParty任何HTTP请求我的rails /西纳特拉应用将使。 我周围挖了HTTParty的代码,发现含有使用的定义异常的文件。 大! 提出请求的时候我就拯救他们。

为了测试它,我把一个假域名请求,但不是HTTParty :: ResponseError例外,我希望,我不是得到了一个SocketError例外。

什么是解决这个问题的最好方法是什么? 我知道,HTTParty是Ruby开发的一种包装,而这可能就是扔SocketError例外。 但是,我怎么会知道,是否正常?

我可以只挽救“例外”解决这个问题,但是这是很可怕的做法。 我宁愿深知我可能会造成和处理这些例外的。

编辑:我要澄清,真正促使我创建这个问题是我不知道我怎么能弄清楚,可以在调用特定功能时提出的可能的例外......也就是说,不通过每一个函数调用期待在堆栈中。

Answer 1:

总体而言(我不是一个程序员红宝石)我用下面的办法。

我处理以下列方式例外:

  • 我从中恢复? 如果该异常可能发生,我知道我能恢复或重试可能的话,我来处理异常。

  • 是否需要报告? 如果该异常可能发生,但我知道我不能恢复或重试可能,然后我通过登录,然后将它传递给调用者处理异常。 我总是这样做像大模块或服务的自然子系统边界上。 有时(取决于API)我会用'我的模块的具体一个包装该异常,使主叫方只已处理我的例外。

  • 不能处理它? 未处理应该在顶层捕获和(a)报告所有的异常,(b)确保系统保持稳定和一致。 这是一个应该永远在那里不管其他两个是否完成。

当然,还有另外一个特例 - 这是非常严重,他们给你没有机会来对付他们的人。 对于这些,只有一个解决办法 - 后验调试,我发现这样做的最好的事情是日志,日志和多个日志。 且许多系统上工作从小到大,我宁愿牺牲稳定性和可恢复性(除非它的关键)的性能和丰富的添加量记录的 - 内省如果可能的话。



Answer 2:

如果你把一个假域名socketError反应是完全正常。 毕竟 - 尝试连接到一个不存在的域会导致失败AKA SocketError的连接。

对付,最好的办法是使用一个有效的域,在您的测试虚假URL,但赶上socketError在你的生活代码。

这里的问题不在于你赶上了错误的例外,但你要吸用错误的数据测试。

行动最好的办法是了解什么异常可能发生,管理他们,当我说明白了,我得到的 - 哪里的URL从何而来,它是你的用户输入? 如果是的话永远不要相信它,并捕获一切。 它来自你的配置数据; 半信任它,并记录错误,除非它的使命至关重要的URL即可。

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

编辑:什么我试图做的,是提倡一个程序员是意识到自己的行为结果的心态。 我们都知道,尝试连接到“thisServiceIsTotallyBogus.somethingbad.notAvalidDomain”会失败; 但一个程序员的心态应该首先确认正是该领域的来源。 如果用户输入的,那么你必须承担全部检查; 如果你知道它只能由你自己或你的支持团队访问配置文件的; 你可以稍微放松一下; 不过不幸的是,这是一个坏榜样,因为你应该始终测试网址,因为有时网络不能正常工作!

理想情况下,任何你使用的开发者文档应该告诉你什么例外它可以抛出。



文章来源: How to know what exceptions to rescue?