Отладчик не выдаёт исключений

Отладчик не выдаёт предупреждений об исключениях в асинхронном методе, метод просто перестаёт выполнятся.

public async Task Test()
{
   List<string> a = null;
   a.Count;
   // и дальше код не выполняется
   MessageBox.Show("Сообщение").
}

Ответы (2 шт):

Автор решения: Aziz Umarov

Сделайте так, оберните вызов в try catch

public async Task Test()
{
    ....
}

public async void doTest()
{
    try
    {
        await Test();
    }
    catch (Exception ex)
    {
       ...
    }
}
→ Ссылка
Автор решения: Alexander Petrov

Если вызвать асинхронный метод без ожидания

Test();
// или
var task = Test();

то исключение не выбрасывается по следующей причине: неизвестно, где именно его нужно выбросить. Ведь после вызова этого метода выполнение кода ушло далеко вперёд. Могли вызваться многие другие методы, мог произойти выход из текущего метода и т. п. Следовательно, исключение могло бы быть выброшено в любом произвольном месте. Это намного затруднило бы отладку - пойди угадай, где его ждать в следующий раз.

И оборачивание вызова в try-catch совершенно ничего не даст.

Именно поэтому исключение, произошедшее внутри отдельного потока/задачи остаётся в нём до тех пор, пока не будет произведено явное получение результата или ожидание. Оно может быть выполнено одним из следующих способов:

await task
task.Wait()
task.Result
task.GetAwaiter().GetResult()

При этом, если внутри задачи произошло исключение, оно будет выброшено в этом месте. Это логично и понятно, где именно его ловить, где ставить try-catch.

Ссылка на документацию: Exception handling

→ Ссылка