Не удается обработать исключения в асинхронном методе в Debug в Windows 7 - PullRequest
1 голос
/ 19 июня 2019

У меня странная проблема, которая возникала только в режиме отладки в Windows 7. Я пытаюсь отловить исключение, которое выкидываю в методе delcared async.Да, я жду этого, но исключение все еще остается невосприимчивым к внутренним функциям.См. Код ниже.

  • Требуемая версия Framework (4.6.1) установлена ​​в настройках приложения.
  • Попытка установить строгую версию языка C #.
  • В выпускеили Windows 10 работает нормально.
  • Протестировано только в VS 2017.
private void Connect(int port)
{
    lock (apiLocker)
    {
        if (port <= 0)
        {
            throw new ArgumentException("Invalid port number");
        }
        //etc.
    }
}

internal async Task ConnectAsync(int port)
{
    await Task.Run(() =>
    {
        Connect(port);
    });
}

И вызов выглядит так:

private async Task<bool> ConnectAsync()
{
    try
    {
        await RadioDispatcher.Instance.ConnectAsync(connectionSettings.Port);
        return true;
    }
    catch
    {
       //I can't reach that line in Debug on windows 7.
       //In Release on Windows 10 it works fine.
        return false;
    }
}

1 Ответ

1 голос
/ 19 июня 2019

TL; DR: это особенность отладки Visual Studio.Просто нажмите «Продолжить», когда возникнет исключение, и оно будет перехвачено.

Подробнее:

Способ работы async методов заключается в том, что конечный автомат async перехватывает исключение ипомещает его на возвращенный Task.Позже, когда ваш код await s Task, исключение извлекается и повторно генерируется.

Однако Visual Studio имеет специальную логику отладки, которая обнаруживает, что исключение перехватывается после того, как оно имеетоставил ваш код и, похоже, сошел с ума, думая, что ваш код пренебрегал перехватом этого исключения.VS не понимает, что исключение хранится и будет наблюдаться позже.Вот почему вы видите сообщение «необработанное исключение».

Примечание: создание асинхронных оболочек для синхронных методов является анти-паттерном .

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