c# - 如何捕获线程中发生的 Asp.net 核心中的异常
问题描述
有一些任务我附加了一个动作。我有一个用于观察所有异常的中间件。现在,线程异常存在问题。我已经在动作主体中手动抛出异常,但是当我抛出异常时,应用程序进入中断模式状态,我无法监视异常。
在配置mvc之前,我把我的错误处理中间件
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
var code = HttpStatusCode.InternalServerError;
var result = JsonConvert.SerializeObject(new { error = exception.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
//and this is the piece of code that run all tasks.
foreach (var item in BotList)
{
BotHandler BotObject = new BotHandler(item,conn);
Task.Run(() => { BotObject.Run();});
}
//
public void Run()
{
//BotClient.StopReceiving();
BotClient.OnMessage += BotOnMessageReceived;
BotClient.OnMessageEdited += BotOnMessageReceived;
BotClient.OnCallbackQuery += BotOnCallbackQueryReceived;
}
private async void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs)
{
try
{
//do something
string a = null;
var b = a.ToString();
}
catch(Exception exp )
{
throw exp
}
}
}
解决方案
如果你去这里https://msdn.microsoft.com/en-us/magazine/jj991977.aspx你会读到的。
Catch 无法捕获来自异步 Void 方法的异常
因此,您无法捕获您在 BotOnMessageReceived 方法(在 Catch 部分)中抛出的异常(中间件不能)。
所以你有2个解决方案。
- 删除 async 关键字
- 或者如果可能的话,捕获应用程序未处理的异常。例如,在普通的 .net 框架控制台应用程序中,您在应用程序中有称为未处理异常的事件,并且可以处理像您这样的情况。
我也在这里找到了 smth,也许它会有所帮助 How do I catch unhandled exceptions in ASP .NET Core 2.0 before the page is rendering?
推荐阅读
- tensorflow - In CNN network, should input image go to all neurons in first convolution layer (I mean first hidden layer) or not?
- javascript - Angular - All Input values are changing on select changes in formarray
- rust - Communicating with a child process through a Tokio UnixStream
- angular - ngFor 循环列表中的第一个和最后一个对象
- python - 添加新元素后如何更新列表
- java - 在 Liberty Server 上运行 spring-boot 应用程序
- c++ - 如何使用 XOR 加密字符串而不包含奇怪的字符?
- c# - 一段时间过去后,如何依次启用布尔值?
- javascript - 为什么 React Hooks 不更新数据
- bash - 将文件名缩短为 n 个字符,同时保留文件扩展名