- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试获取自定义 IExceptionHandler
来与我的 Azure Function(C# 类库)配合使用。我的想法是拥有自己的异常处理程序来处理意外异常,其中将包含我自己的内存中跟踪日志;澄清一下,我确实希望将这些发送到客户端浏览器并向用户显示。
详细信息如下。
使用这个简单的自定义异常处理程序:
public sealed class CustomExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
context.Result = new ResponseMessageResult(
context.Request.CreateErrorResponse(HttpStatusCode.BadRequest,
"custom message string"));
}
}
我尝试这样安装它:
[FunctionName("Function1")]
public static HttpResponseMessage Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "works")]
HttpRequestMessage req)
{
req.GetConfiguration().Services.Replace(typeof(IExceptionHandler),
new CustomExceptionHandler());
throw new Exception("unexpected exception");
}
但是部署后,我只是收到通用的“操作失败”错误消息(例如,来自 Chrome 的 XML 格式):
<ApiErrorModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Microsoft.Azure.WebJobs.Script.WebHost.Models">
<Arguments xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" i:nil="true"/>
<ErrorCode>0</ErrorCode>
<ErrorDetails i:nil="true"/>
<Id>dec07825-cf4e-49cc-a80e-bef0dbd01ba0</Id>
<Message>An error has occurred. For more information, please check the logs for error ID dec07825-cf4e-49cc-a80e-bef0dbd01ba0</Message>
<RequestId>51df1fec-c1c2-4635-b82c-b00d179d2e50</RequestId>
<StatusCode>InternalServerError</StatusCode>
</ApiErrorModel>
如果我在 AF UI 中打开诊断日志 -> 详细错误消息
并尝试确保始终写入详细错误消息:
[FunctionName("Function1")]
public static HttpResponseMessage Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "works")]
HttpRequestMessage req)
{
req.GetRequestContext().IncludeErrorDetail = true;
req.GetRequestContext().IsLocal = true;
req.GetConfiguration().Services.Replace(typeof(IExceptionHandler),
new CustomExceptionHandler());
throw new Exception("unexpected exception");
}
然后我确实获得了异常详细信息,但显然仍然由内置异常处理程序(来自 Chrome 的 XML 格式)处理:
<ApiErrorModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Microsoft.Azure.WebJobs.Script.WebHost.Models">
<Arguments xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" i:nil="true"/>
<ErrorCode>0</ErrorCode>
<ErrorDetails>Microsoft.Azure.WebJobs.Host.FunctionInvocationException : Exception while executing function: Function1 ---> System.Exception : unexpected exception at ...</ErrorDetails>
<Id>5e752375-002b-4ab7-a348-20edad64a3fe</Id>
<Message>Exception while executing function: Function1 -> unexpected exception</Message>
<RequestId>b6611456-f3f1-4591-97e4-920dae59b5ff</RequestId>
<StatusCode>InternalServerError</StatusCode>
</ApiErrorModel>
所以这公开了堆栈跟踪和异常消息,但我没有内存中跟踪日志。
我想做的是自己创建意外异常的响应消息。例如,对于预期异常,我的自定义错误响应如下所示(JSON 格式,来自 Postman):
{
"message": "An error has occurred.",
"exceptionMessage": "Could not find package `nito.bob`",
"exceptionType": "Common.ExpectedException",
"stackTrace": " at ...",
"log": [
"Received request for jsonVersion=4, packageId=`nito.bob`, packageVersion=``, targetFramework=``",
"Looking up latest package version for `nito.bob`",
"No non-prerelease package version found for `nito.bob`; looking up latest prerelease package version",
"No package version found for `nito.bob`",
"Returning 404: Could not find package `nito.bob`"
],
"requestId": "b2df08cb-1071-4e47-bd24-bf74152e4b2a"
}
这只是基本的 HttpError
格式的异常(包含详细信息),我用 log
和 requestId
对其进行了扩充。由于这是一个预期的异常,因此这不是在 IExceptionHandler 中完成的;我只是返回 HttpResponseMessage
。
有趣的部分:我的自定义 IExceptionHandler
在本地托管 AF 时工作得很好。它只是不起作用 when deployed 。如果我获取 the code 并在本地运行它,我会得到我期望的响应(来自 Postman 的 JSON 格式):
{
"Message": "custom message string"
}
对我不起作用的替代方法:
异常
并返回HttpRequestMessage.CreateErrorResponse
。我已经针对预期异常执行了此操作,并且效果很好。对于意外异常来说,这不是一个好的解决方案,因为我希望函数执行被明确标记为“失败”。返回 HttpResponseMessage
(即使带有 500 状态代码)会被 AF 运行时视为“成功”,并且不会在仪表板或日志中显示为“失败”(或者可能会被 App Insights 显示为“失败”,尽管如此)我还没有明确检查过)。最佳答案
我认为您正在寻找的是FunctionExceptionFilterAttribute
。
这是一个关于如何实现抽象类的简单代码示例:
public class YourErrorHandlerAttribute : FunctionExceptionFilterAttribute
{
public override async Task OnExceptionAsync(FunctionExceptionContext exceptionContext, CancellationToken cancellationToken)
{
var fn_name = exceptionContext.FunctionName;
var fn_instanceId = exceptionContext.FunctionInstanceId;
var ex = exceptionContext.Exception;
// TODO: your logic here.
}
}
以下是如何在您的函数中使用它:
[FunctionName("Function1")]
[YourErrorHandler]
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "works")]
HttpRequestMessage req)
{
// TODO: your Azure Function logic / implementation.
}
它的行为类似于 ASP.NET MVC 中的 ActionFilterAttribute
关于c# - 自定义 IExceptionHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840623/
我正在尝试获取自定义 IExceptionHandler 来与我的 Azure Function(C# 类库)配合使用。我的想法是拥有自己的异常处理程序来处理意外异常,其中将包含我自己的内存中跟踪日志
我正在尝试获取自定义 IExceptionHandler 来与我的 Azure Function(C# 类库)配合使用。我的想法是拥有自己的异常处理程序来处理意外异常,其中将包含我自己的内存中跟踪日志
我在这个示例中面临以下问题: 我无法在 ExceptionContext 中找到 IsOutermostCatchBlock 如果发生异常,此 HandleAsync 方法将执行两次。 ( http:
处理 IExceptionHandler 的多个实现的最佳方法是什么?在 WebAPI 中? config.Services.Replace(typeof(IExceptionHandler), ne
我正在使用 ASP.NET 和 F# 构建 Web API。我有一个 IExceptionHandler 的实现。 type DefaultExceptionHandler() = let mapEx
我正在尝试为 ASP.NET web api 编写一个全局错误处理程序,它能够记录在我的 api 中导致未处理异常的请求的请求详细信息。我已经在我的 OWIN 启动类中注册了以下 GlobalExce
我创建了一个 OWIN 中间件来捕获异常。中间件实际上什么都不做,只是像这样用 try catch 包裹下一个调用 try { await _next(environment) } catch(E
在 C# 中实现这些处理程序时,我会做类似的事情, public class DefaultExceptionHandler : IExceptionHandler { public Task
我是一名优秀的程序员,十分优秀!