0

我有一個場景,我想圍繞暴露使用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

回答

0

你應該能夠只是await內的任務,捕獲異常,並拋出了包裝的異常:

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