【问题标题】:Handling exceptions in wrapper class converting methods from APM to TAP处理包装类中的异常,将方法从 APM 转换为 TAP
【发布时间】:2017-09-16 03:19:13
【问题描述】:

我有一个场景,我想围绕一个使用 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 方法中对此进行一些处理,但到目前为止都失败了。

你们对如何实现这一点有任何建议吗?

【问题讨论】:

  • 你是说catch (WrappedException we) 没有捕捉到WrappedException。你能发布一个可重复的例子吗?此外,此入门指南可能会有所帮助:TAP Wrappers for APM Implementations

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


【解决方案1】:

你应该可以只 await 内部任务,捕获异常,然后抛出被包装的异常:

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

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2014-04-17
    • 2011-11-18
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多