Мне нужно перевести исключение, исходящее от Task<T>
, таким же образом, как это делается для обычного синхронного кода:
try {
client.Call();
} catch(FaultException ex) {
if (ex.<Some check>)
throw new Exception("translated");
}
Однако я хочу сделать это асинхронно, т. Е. Call
выше на самом деле Task CallAsync()
.
Так что в C # 5 мой метод будет выглядеть так:
async Task CallAndTranslate()
{
try{
await client.CallAsync();
} catch(FaultException ex) {
if (ex.FaultCode ...)
throw new Exception("translated");
}
}
Но сейчас я использую C # 4.
Итак, что я могу сделать, если хочу запустить задачу, но перевести ошибку (TPL), а затем снова представить все это как Task<T>
?
- исходящий из веб-сервиса WCF, но это не важно здесь
РЕДАКТИРОВАТЬ: немного более конкретный способ сказать это:
public class TranslatingExceptions
{
public Task ApiAsync() // The inner layer exposes it exactly this way
{
return Task.Factory.StartNew(()=>{ throw new Exception( "Argument Null" );});
}
public Task WrapsApiAsync() // this layer needs to expose it exactly this way
{
// async preview pseudocode for what I need to do
try {
await ApiAsync( );
} catch (Exception exception){
if( exception.Message == "Argument Null" )
throw new ArgumentNullException();
}
}
[Fact]
public void Works()
{
var exception = Record.Exception( () =>
WrapsApiAsync().Wait());
Assert.IsType<ArgumentNullException>( exception.InnerException);
}
}
Как бы вы реализовали WrapsApiAsync()
без необходимостиC # 5?