2010-02-16 79 views
0

我正在寫一個同步方法,在另一臺服務器上調用異步方法。服務器的方法在完成時調用回調函數,並且在出現錯誤的情況下,回調參數中的一個包含異常。我想從我的方法拋出一個異常,將服務器的異常作爲它的InnerException。然而,爲了捕捉到這個例外,我必須把它裝箱,似乎應該有一個更簡單的方法。這是代碼味道嗎?我應該怎麼做更簡單?我應該如何處理異步方法中引發的異常? (或者,這是一個代碼的氣味?)

我的代碼是這樣的:

private class BoxedException 
{ 
    public Exception Exception; 
} 

public bool MyMethod() 
{ 
    EventWaitHandle waitHandle = new new EventWaitHandle(false, EventResetMode.ManualReset); 
    BoxedException boxedException = new BoxedException(); 

    bool called = theServer.ServerMethod(getCallback(waitHandle, boxedException)); 
    if (called) 
    { 
     waitHandle.WaitOne(); 

     if (boxedException.Exception != null) 
      throw new Exception("ServerMethod failed", boxedException.Exception); 
    } 
} 

private ServerCallback getCallback(EventWaitHandle waitHandle, BoxedException be) 
{ 
    return (object sender, ServerArgs e) => 
    { 
     handleServerArgs(e, be); 
     waitHandle.Set(); 
    }; 
} 

private void handleServerArgs(ServerArgs e, BoxedException be) 
{ 
    if (e.Exception != null) 
    { 
     be.Exception = e.Exception; 
    } 
    else 
    { 
     // do stuff... 
    } 
} 

回答

2

沒有什麼本質上的區別,從外部進程傳回一個盒裝的異常,特別是如果你有嵌套內部異常或需要堆棧跟蹤。如果你只對異常消息感興趣,你可以簡單地將它們連接成一個字符串,然後再傳遞回去。

1

您是通過將拉姆達在它自己的方法使得它有點難以自己。如果您將它內聯編寫,它會變得更容易。事情是這樣的:

 var waitHandle = new ManualResetEvent(false); 
     Exception fault = null; 
     bool called = theServer.ServerMethod((obj, se) => { 
      if (se.Exception != null) fault = se.Exception; 
      else ProcessServerResponse(se); 
      waitHandle.Set(); 
     }); 
     if (called) { 
      waitHandle.WaitOne(); 
      if (fault != null) kaboom(fault); 
     } 
+0

爲真,但是不能使用編輯並繼續。 – Simon

相關問題