Есть ли вероятность, что это проблема асинхронности?
Как отмечено в другом ответе, да, это асинхронная проблема.
Асинхронные и итераторные блоки в C # являются сопрограммами . Нормальная процедура может выполнять три вещи: выполнить до конца, бросить или войти в бесконечный цикл Сопрограмма может сделать четвертое: приостановить, чтобы возобновить позже . await
- это точка в асинхронном блоке, где происходит приостановка; yield return
в блоке итератора.
В вашем случае бросок не происходит, пока сопрограмма не возобновится, и в этот момент try
больше не действует; метод с try
завершился , потому что это , а не сопрограмма. Если вы хотите, чтобы try
действовал, тогда попытка должна быть в асинхронном блоке также , и вы должны await
внутри попытки.
Аналогично, если вы написали:
IEnumerable<int> Weird(bool b)
{
if (b) throw new Exception();
yield return 1;
}
...
IEnumerable<int> x = null;
try
{
x = Weird(true); // Should throw, right?
}
catch(Exception ex)
{
// Nope; this is unreachable
}
foreach(int y in x) // the throw happens here!
Сопрограмма блока итератора начинает приостанавливаться и не возобновляется до тех пор, пока MoveNext
не будет вызвана для итератора; все, что он делает, это возвращает итератор. Сопрограмма асинхронного блока приостанавливает в ожидании , но не требуется для приостановки в ожидании; В ожидании уже выполненного задания можно пропустить приостановку.
попробовать с сопрограммами сложно; будь осторожен!