To zależy trochę na kiedy chcesz błąd zostać podniesiona - tj niecierpliwością, lub jako część tego, co godne podziwu. Podobnie jak w przypadku bloków iteracyjnej, jeśli chcesz chętnych kontroli błędów, potrzebne są dwa sposoby, na przykład:
public Task<int> SomeMethod(..args..) {
if(..args fail..) throw new InvalidOperationException(...);
return SomeMethodImpl(...args...);
}
private async Task<int> SomeMethodImpl(...args...)
{
... await etc ...
}
ten będzie następnie wykonać żadnego argumentu sprawdzania jako część pierwszego połączenia, nie awaitable. Jeśli chcesz wyjątek stanowić część awaitable, można po prostu wyrzucić go:
public async Task<int> SomeMethod(..args..) {
if(..args fail..) throw new InvalidOperationException(...);
... await etc ...
}
Jednak w swojej przykład fakt, że jesteś return
ing Task
sugeruje, że nie jest to faktycznie metoda async
, ale jest to metoda async (ale nie async
). Nie można po prostu zrobić:
return new Task(() => { throw new ArgumentNullException("argument"); });
bo Task
nigdy nie zostały uruchomione - i nigdy nie będzie. I podejrzany trzeba by zrobić coś takiego:
try {
throw new InvalidArgumentException(...); // need to throw to get stacktrace
} catch(Exception ex) {
var source = new TaskCompletionSource<int>();
source.SetException(ex);
return source.Task;
}
który jest ... trochę łyk i prawdopodobnie mógłby być obudowane nieco lepiej. To zwróci wartość Task
, która wskazuje, że znajduje się ona w stanie Faulted
.
Docelowy framework to 4.0, więc nie używam asynchronicznego i oczekuję słów kluczowych. – Demarsch
Druga opcja powinna być napisana jako Task.Factory.StartNew (() => {throw ...}); Zaktualizował go w pytaniu – Demarsch
@Demarsch po prostu dodaj [Microsoft.Bcl.Async] (https://www.nuget.org/packages/Microsoft.Bcl.Async) i 'async' /' czekaj' działa dobrze –