有些动作是我附加的动作。我有一个用于观察所有异常的中间件。现在,线程异常出现了问题。我已经在操作主体中手动引发了异常,但是当我引发异常时,应用程序进入中断模式状态,并且我无法监视异常。
在配置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
}
}
}
答案 0 :(得分:1)
据我了解,您是在控制器的作用下运行此代码的:
//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();});
}
主要问题是您正在尝试为已完成的请求运行任务。这就是为什么ExceptionHandlingMiddleware(实际上是其他中间件)无法处理任何事情的原因。要解决您的问题,您可以添加try / catch块来处理意外的异常。
我强烈建议不要在HTTP请求期间启动后台任务。这是一种容易出错的方法,因为任务可能随时关闭,您甚至都不会注意到。代替此方法,最好使用后台任务(msdn,SO Discussion),某种AWS lambda / Azure函数或其他任务计划程序。
如果在调用HTTP方法后需要做一些重新计算工作,则可以考虑使用异步消息处理来触发该过程。
答案 1 :(得分:0)
如果您去https://msdn.microsoft.com/en-us/magazine/jj991977.aspx,您会读到它。
异步虚假方法的异常无法捕获
因此,您无法捕获在BotOnMessageReceived方法(在Catch部分中)中抛出的异常(中间件无法捕获)。
所以您有2种解决方案。
我也在这里找到了东西,也许会有所帮助 How do I catch unhandled exceptions in ASP .NET Core 2.0 before the page is rendered?