Да, исключения вызывают состояние сбоя (за исключением случаев, когда выбрасывается OperationCancelledException
, тогда его свойство IsCanceled
становится истинным).
Невозможно установить задачу непосредственно в сбой, кроме случаев использования TaskCompletitionSource источник напрямую с помощью метода .SetException
.
Но какая у вас проблема с выдачей исключения? После обработки исключения вы можете просто выбросить его
Task.Run(() =>{
try
{
DoSomething();
}
catch(InvalidOperationException ex)
{
logging.Error("Something went wrong", ex);
// rethrow the same exception.
// Don't do: "throw ex" as it changes stack trace, making debugging harder
throw;
}
});
В качестве альтернативы использовать C# 6.0 , когда язык конструирует для ведения журнала.
Task.Run(() =>{
try
{
DoSomething();
}
catch(InvalidOperationException ex) when (LogException(ex))
{
}
});
...
private bool LogException(ex)
{
logging.Error("Something went wrong", ex);
// returning true means, exception block will be executed
// returning false means, exception block won't be executed
return false;
}
Таким образом, ведение журнала будет выполнено, но само исключение не будет перехвачено (и будет перехвачено ожидающей задачей.