除了避免使用async void
的原因之外,是否有可能从调用代码中捕获以下错误?
private static Action ErrorAction
{
get
{
return async () =>
{
await Task.Delay(0);
throw new NotImplementedException();
};
}
}
例如在以下两个示例中,我想收集抛出的异常,但是两个测试都失败了:
[Test]
public void SelfContainedExampleTryCatch()
{
List<Exception> errors = new List<Exception>();
try
{
ErrorAction();
}
catch (Exception ex)
{
errors.Add(ex);
}
errors.Count().Should().Be(1);
}
[Test]
public void SelfContainedExampleContinueWith()
{
List<Exception> errors = new List<Exception>();
var task = Task.Factory.StartNew(ErrorAction);
task.ContinueWith(t =>
{
errors.Add(t.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);
task.Wait();
errors.Count().Should().Be(1);
}
我知道我可以使用带有"async Task"标识的方法; 但具体来说,我需要处理可分配委托异步代码示例的Action。在全局级别捕获不可行。如果可以的话,对于同步和异步操作都通用的解决方案是理想的。希望有一个简单的解决方案,但到目前为止,我只是走了许多死路,并且(也许不正确地)得出结论它是不可能的。任何帮助(或节省时间)都将不胜感激!
ErrorAction();
这一行出现未处理的异常导致失败了? - masonerrors.Count().Should().Be(1);
处的测试将会失败,因为异常不会被传播。 - Ilianvar task = MyCallAsync(); task.Wait();
来执行它。 - mason