Azure 函数应该记录错误还是抛出异常?

Posted

技术标签:

【中文标题】Azure 函数应该记录错误还是抛出异常?【英文标题】:Azure Function should log or throw exception on error? 【发布时间】:2020-03-08 05:06:56 【问题描述】:

我有可能会失败的 Azure 函数(Http 触发器)。我还为其配置了 Application Insights。

如果出现错误(哪个更好):

    捕获异常,包含更多信息并重新抛出它。 (发送 500 响应)或 捕获异常,记录,包装,重新抛出给调用者。 (发送 500 响应)或 捕获异常,记录(不要抛出),手动发送 500 响应。

Application Insight 能够记录异常。我真的看不出同时记录错误和抛出异常的意义。

指导方针是什么?什么是好的做法?

【问题讨论】:

有两篇关于异常处理的文章我经常链接并考虑阅读:blogs.msdn.microsoft.com/ericlippert/2008/09/10/… | codeproject.com/Articles/9538/… |从第一篇文章开始,Web 错误往往属于“外生”部分。 |如果(以及何时)应该换行将在第 2 部分讨论。 我记得最近的一个问题是包装很有帮助。我们得到一个 IOException,其消息显然来自 Argument Exception(函数参数为 null 或类似的)。所以它很可能围绕着原始的 ArgumentException。它确实添加了“语法值”,因为现在我知道 Argument Exception 发生在 IO 代码中的某个位置。 Hooch,你目前最喜欢的方法是什么?让 Function 应用基础架构将引发的异常记录到连接的 AppInsights 中? 【参考方案1】:

根据我使用 Python 构建 HTTP 触发的 azure 函数的经验,我注意到:在处理异常然后手动向客户端返回某些内容时,您确实可以控制函数返回值,但框架将函数的工作标记为“ Succeeded”,这使得在 Application Insights 中跟踪和监控变得更加困难。

对于您的问题,我最终得到了一个混合 1 和 3 的 catch 子句 即一种混合方法,我尝试识别异常的来源,然后对于来自我的代码的异常,我将其包装并返回 500,对于源自我正在使用的代码的其他异常,我重新抛出它们并让azure 函数框架返回 500 并将函数的作业标记为“失败”。

【讨论】:

以上是关于Azure 函数应该记录错误还是抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA如何抛出异常

当我不知道它可能会抛出哪里时,如何记录异常?

数据访问对象 (DAO) 中的方法应该抛出还是捕获其异常? [关闭]

声纳抱怨记录或重新抛出异常

记录后重新抛出 UncaughtExceptionHandler 异常

如何抛出 C++ 异常