Код исключения 0xe0434352, который приводит к сбою w3wp.exe |DotNet Run - PullRequest
0 голосов
/ 07 ноября 2019

Я обнаружил, что на моем сервере произошел сбой сервера, который не был обработан глобальным обработчиком исключений. Я не совсем уверен, что то, что я опишу, - это та же проблема, что и у меня (использование сторонних библиотек плюс пользовательская логика посередине ... сложно проанализировать полный код), хотя я подозреваю, что это то же самое.

  • Может кто-нибудь объяснить мне, почему глобальный обработчик исключений не может обрабатывать исключения, возникшие после начала написания ответа?
  • И если мы можем что-то сделать с этим?

Я использую ядро ​​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.

1 Ответ

0 голосов
/ 08 ноября 2019

Как упомянуто выше в комментариях @KirkLarkin, проблема async void. Вот несколько ссылок с более подробной информацией:

Async Guidance

TaskScheduler.UnobservedTaskException Event

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...