Отладчик не выдаёт исключений
Отладчик не выдаёт предупреждений об исключениях в асинхронном методе, метод просто перестаёт выполнятся.
public async Task Test()
{
List<string> a = null;
a.Count;
// и дальше код не выполняется
MessageBox.Show("Сообщение").
}
Ответы (2 шт):
Сделайте так, оберните вызов в try catch
public async Task Test()
{
....
}
public async void doTest()
{
try
{
await Test();
}
catch (Exception ex)
{
...
}
}
Если вызвать асинхронный метод без ожидания
Test();
// или
var task = Test();
то исключение не выбрасывается по следующей причине: неизвестно, где именно его нужно выбросить. Ведь после вызова этого метода выполнение кода ушло далеко вперёд. Могли вызваться многие другие методы, мог произойти выход из текущего метода и т. п. Следовательно, исключение могло бы быть выброшено в любом произвольном месте. Это намного затруднило бы отладку - пойди угадай, где его ждать в следующий раз.
И оборачивание вызова в try-catch совершенно ничего не даст.
Именно поэтому исключение, произошедшее внутри отдельного потока/задачи остаётся в нём до тех пор, пока не будет произведено явное получение результата или ожидание. Оно может быть выполнено одним из следующих способов:
await task
task.Wait()
task.Result
task.GetAwaiter().GetResult()
При этом, если внутри задачи произошло исключение, оно будет выброшено в этом месте. Это логично и понятно, где именно его ловить, где ставить try-catch.
Ссылка на документацию: Exception handling