处理从APM到TAP的包装类转换方法中的异常

问题描述:

我有一个场景,我想围绕暴露使用APM模式的异步方法的类创建一个包装类。我的想法是,包装类应该轻拍模式的优势和暴露出的包装方法,如下面所示例:处理从APM到TAP的包装类转换方法中的异常

public class ClassToBeWrapped 
{ 
    ... 
    // Throws ExceptionToBeWrapped when used incorrectly 
    public void BeginRead() 
    ... 
} 

public class WrapperClass 
{ 
    ... 
    public Task<int> ReadAsync() 
    { 
    return Task.Factory.FromAsync(classToBeWrapped.BeginRead,...); 
    } 
} 

当包装类的消费调用ReadAsync方法,我想包装的方法的任何自定义异常被包装并传递给消费者而不是原始的例外。

public class ConsumerClass 
{ 
    ... 
    try 
    { 
    await wrappedClass.ReadAsync(...); 
    }catch (WrappedException we) 
    { 
    // Does not catch WrappedException, only ExceptionToBeWrapped 
    ... 
    } 

但是,我总是最终捕捉catch方法中的非包装异常。我怀疑我必须在ReadAsync方法中做一些处理,但到目前为止失败了。

做任何你有任何建议如何做到这一点?

+0

你是说'抓(WrappedException我们)'不赶上'WrappedException'。你能发布一个可重现的例子吗?另外,本入门指南可能会有所帮助:[APAP实现的TAP包装器](https://blog.stephencleary.com/2012/07/async-interop-with-iasyncresult.html) – JSteward

你应该能够只是await内的任务,捕获异常,并抛出了包装的异常:

public async Task<int> ReadAsync() 
{ 
    try 
    { 
    return Task.Factory.FromAsync(classToBeWrapped.BeginRead,...); 
    } 
    catch (ExceptionToBeWrapped ex) 
    { 
    throw new WrappedException(ex); 
    } 
}