我需要以同样的方式翻译由<代码>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)的任务。 Fault betrans, 然后再次将整件事情作为Task<T>
?
- originally emanating from a WCF webservice but that s not important here
EDIT:略微更具体地说:
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);
}
}
如果没有需要C# 5,你将如何执行<条码>。