Я обнаружил, что на моем сервере произошел сбой сервера, который не был обработан глобальным обработчиком исключений. Я не совсем уверен, что то, что я опишу, - это та же проблема, что и у меня (использование сторонних библиотек плюс пользовательская логика посередине ... сложно проанализировать полный код), хотя я подозреваю, что это то же самое.
- Может кто-нибудь объяснить мне, почему глобальный обработчик исключений не может обрабатывать исключения, возникшие после начала написания ответа?
- И если мы можем что-то сделать с этим?
Я использую ядро ASP.Net 3.0
public class Startup
{
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
app.UseExceptionHandler(options => options.Run(HandleException));
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest2);
}
private Task HandleException(HttpContext context) {
try
{
var exceptionFeature = context.Features.Get<IExceptionHandlerPathFeature>();
Console.WriteLine("Unhandled exception");
}
catch { /*ignore*/ }
return Task.CompletedTask;
}
private static void HandleMapTest1(IApplicationBuilder app) {
app.Run(async context =>
{
throw new System.Exception("It will be caught by HandleException");
await context.Response.WriteAsync("Map Test 1");
});
}
private static void HandleMapTest2(IApplicationBuilder app) {
app.Run(async context =>
{
var x = new MyClass();
x.DoDSomething();
});
}
}
class MyListener
{
public void Check(Action<int> action) {
action(1);
}
}
class MyClass
{
public MyListener DoDSomething() {
var x = new MyListener();
x.Check(EnterFieldNode);
return x;
async void EnterFieldNode(int num) => await Validate();
}
private async Task Validate() {
// do something that explodes
throw new Exception();
}
}
Я обнаружил эту статью , которая использует событие UnhandledException из AppDomain для перехвата исключения, хотя это невозможно(по крайней мере, простым способом), чтобы избежать сбоя сервера.
ОБНОВЛЕНИЕ 1: Пример обновлен. Наконец удалось воспроизвести. Код максимально похож на то, что происходит с сторонней библиотекой, которую я использую. Это приводит к сбою процесса w3p, и я получил ошибку в средстве просмотра событий с кодом исключения 0xe0434352.