У меня проблема с перебрасыванием исключения в ядре asp.net.
Протестировано под .net core 2.1.402
[HttpPost("processmessage")]
public async Task<ActionResult> Process(JObject obj, CancellationToken token)
{
var t = Task.Run(() => { return Task.FromException(new Exception("ab")); });
try
{
await t;
}
catch (Exception ex)
{
throw;
var x = 0;
}
return Ok();
}
Ожидаемый результат: исключение должно быть переброшенои обрабатывается фильтром исключений ядра asp.net \ middleware и т. д.
Текущий результат: я могу перехватить исключение внутри перехвата перехвата, но исключение не вызывается повторно на уровне asp.net.Запрос застрял (в почтальоне) на несколько минут.
Я тоже пробовал:
[HttpPost("processmessage")]
public async Task<ActionResult> Process(JObject obj, CancellationToken token)
{
var t = Task.Run(() => { throw new Exception("ab"); });
try
{
await t;
}
catch (Exception ex)
{
throw;
}
return Ok();
}
И этот код работает совершенно так же, как и предыдущий.
ЕдинственныйРабочее решение для меня:
[HttpPost("processmessage")]
public async Task<ActionResult> Process(JObject obj, CancellationToken token)
{
var t = Task.Run(() => { throw new Exception("ab"); });
try
{
t.Wait(TimeSpan.FromSeconds(10));
}
catch (Exception ex)
{
throw;
}
return Ok();
}
Кто-нибудь может объяснить, почему я не могу повторно выбросить исключение в первых двух сценариях?Ожидается ли такое поведение или это ошибка в asp.net?
=== Обновление 10.18
Пример : https://github.com/skynet2/net-core-debugger-issue/blob/master/WebApplication2/Controllers/ValuesController.cs
Через некоторое времяДополнительные исследования позволили мне найти причину такого странного поведения.В моем случае проблема заключается в DataServerExceptionFilter, а причина - Debugger.Break () ;
Я ставлю точку останова на каждой строке в фильтре исключений, и странная вещь заключается в том, что точка останова до Debugger.Break работает , но после Dubbuger.Break вся обработка останавливается ,и это не работает для асинхронного, но работает для .Wait ()