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

时间:2017-09-01 06:20:56

标签: c# asynchronous exception-handling task-parallel-library

我有一个场景,我想围绕一个类使用APM模式公开异步方法创建一个包装类。我的想法是包装类应该利用TAP模式并公开包装器方法,如下面的exampled:

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方法中对此进行一些处理,但到目前为止都失败了。

您是否有任何关于如何实现这一目标的建议?

1 个答案:

答案 0 :(得分:0)

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

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