http - Http 触发的 azure 函数中的异常处理 - 更好地控制 JSON 内容响应
问题描述
我想知道在 Http 触发的 azure 函数中处理异常的一个好习惯——详细来说我想知道在出现未处理异常的情况下的标准输出——它会产生 HTTP 错误状态 500 和一个关于详细错误消息和 errorCode 的 JSON 正文
它是关于 azure functions v1 - .NET 4.6.1 - VS 2017 中的一个装配项目(我不确定 v2 中的情况 - 它可能会有所不同)
波纹管是带有消息“Test1”(以及内部异常“Test2”的抛出(未处理)异常的响应主体的示例
{
"id": "942e63a9-6c47-425a-94da-247297953035",
"requestId": "fa2d2bd9-8e9e-49eb-8751-b023f3a87f73",
"statusCode": 500,
"errorCode": 0,
"message": "Exception while executing function: CheckSite -> Test1 -> Test2",
"errorDetails": "Microsoft.Azure.WebJobs.Host.FunctionInvocationException : Exception while executing function: TestSite ---> System.Exception : Test1 ---> System.Exception : Test2 \r\n End of inner exception\r\n at async TestSite.Check..."
}
还添加了一个代码示例:
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequestMessage req, TraceWriter log, ExecutionContext execCtx)
{
try
{
// a business logic
// ...
throw new Exception("something wrong with internal data", new Exception("something inner wrong with internal data2"));
// ...
}
catch (Exception ex)
{
var correlationId = Guid.NewGuid().ToString();
log.Error($"Exception: correlationId: {correlationId}, type: {ex.GetType().Name} : {ex.Message}");
log.Error($"Exception: correlationId: {correlationId}, stack: {ex.StackTrace}");
return HttpUt.ErrResponse(HttpStatusCode.InternalServerError, "unexpected error", correlationId);
}
}
我的目标是拦截具有某些较高级别和相关 ID 的“低级别详细消息”消息。仅在 Run 方法上使用全局 try-catch 块并抛出具有相关 ID 的新异常(并记录原始异常)几乎是成功的
与完全控制内容的返回 HttpResponseMessage(errStatusCode) 相比,抛出新异常似乎更好,因为它使 azure 函数“成功”失败:) 并且记录了该失败。但是是否有可能如何更好地控制 JSON 主体以应对该故障 - 例如在 JSON 主体中有自己的 errorCode 值或其他自定义项?
(解决方案可能会以某种方式使函数失败甚至返回 HttpResponseMessage(errStatusCode),但我不知道该怎么做)我还想知道在 azure fn v2 中是否有解决该问题的方法?
解决方案
推荐阅读
- swift - 呈现 UIAlert 时的长时间延迟
- javascript - 为什么 nginx 不能在 AJAX 请求中处理 base64 图像(Laravel、Javascript、Nginx)
- spring - Junit/Fongo:如何在单元测试中使用 Fongo 来检查 NotNull
- amazon-web-services - AWS Certificate Manager 中处于待处理状态的证书
- python - 301 使用 Flask 将旧 URL 重定向到新 URL
- uwp - 使用平板电脑水平拍摄照片,但获得垂直照片
- sql-server - 如果有值,则选择语句返回,如果没有值
- ftp - 从 FTP 服务器检索文件
- javascript - 为什么 ng-change 没有在 Angular js 中触发?
- python - 如何在 Python 3.6 中创建自动换行程序