Como relançar corretamente uma exceção de tarefa já em estado com falha?
Eu tenho um método síncrono que, entre outras coisas, verifica o status de uma tarefa pendente e relança sua exceção, se houver:
void Test(Task task)
{
// ...
if (task.IsFaulted)
throw task.Exception;
// ...
}
Isso não propaga as informações de rastreamento de pilha de exceção e é hostil ao depurador.
Agora, se oTest
estavaasync
, não seria tão simples e natural como isto:
async Task Test(Task task)
{
// ...
if (task.IsFaulted)
await task; // rethrow immediately and correctly
// ...
}
Pergunta: como fazer isso certo para um método síncrono? Eu vim com isso, mas eu não gosto disso:
void Test(Task task)
{
// ...
if (task.IsFaulted)
new Action(async () => await task)();
// ...
}