2012-04-02 39 views
2

讓我們說我們有一個外部服務器,我們使用(例如 - 電話站等)。另外,我們有下一個代碼:可能引起內部攻擊的調用方法

try 
{ 
    externalService.CreateCall(callParams); 
} 
catch (Exception ex) 
{ 
    _log.Error("Unexpected exception when trying execute an external code.", ex); 
    _callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed); 
    throw; 
} 

理論上UpdateCallState可以拋出,但我們將隱藏使用此代碼例外,像對待只有在正確的方式通過CreateCall產生的異常。

問題是,這些情況的正確模式是什麼,以便我們正確處理所有異常?

+0

分開稱呼它。不要嵌套可能的可惡的異常調用。它可能會讓你的代碼變得複雜,並且你將無法正常恢復任何狀態。 – Zenwalker 2012-04-02 08:44:34

+0

在這種情況下,如果因任何原因造成呼叫失敗,您必須掛斷電話。你必須打電話給它。 – 2012-04-02 08:45:39

+0

你是什麼意思掛斷電話?如果A調用引發異常,則創建一個失敗標誌,然後調用B,這可能會再次拋出異常。如果一個電話沒有,那麼不要撥打B cuz標誌沒有設置。嵌套異常將會產生問題。 – Zenwalker 2012-04-02 08:47:22

回答

4

您可以在第一個捕獲物中嵌套另一個try..catch並適當處理它。

try 
{ 
    externalService.CreateCall(callParams); 
} 
catch (Exception ex) 
{ 
    _log.Error("Unexpected exception when trying execute an external code.", ex); 
    try 
    { 
     _callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed); 
    } 
    catch(Exception updateEx) 
    { 
     // do something here, don't just swallow the exception 
    } 
    throw; // this still rethrows the original exception 
} 
+0

如果'CreateCall'不會引發異常 – 2012-04-02 08:49:14

+2

@ L.B - 將不會調用UpdateCallState'並且?在我看來,只有在'CreateCall'失敗時(基於傳遞的參數是'CallOutcome.Fail'),纔會調用*。另外,這正是OP的代碼最初的工作原理。在downvoting之前嘗試理解問題! – Jamiec 2012-04-02 08:53:02

+0

這就是原始代碼所做的。請注意,看起來updateCallstate也需要在成功上完成,而不是在問題中。 – 2012-04-02 08:55:13

0

分手。類似於

if !TryCreateExternalCall(callParams) 
{ 
    _log.Error("Unexpected exception when trying execute an external code.", ex); 
    _callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed); 
} 
else 
{ 
    throw new ExternalServiceException(???); 
} 

TryCreateExternalCall當然會在它吞下並返回false之前記錄異常和堆棧跟蹤。

+0

在這種情況下,您失去了第一個例外。 – 2012-04-02 08:57:19

+0

@Andrii Startsev - 排序,確實說在吞嚥之前在底部記錄它並返回false。事情是第二次發生,因爲第一次發生。如果你在其他地方的catch塊中調用問題代碼,它是否仍然會吹大塊。我們最多可以說的是,他們可能會在某個時候關聯,有些時候。 – 2012-04-02 17:12:40

-1

您應該首先找出最具體的例外,然後是最常見的例外。

try 
{ 
    externalService.CreateCall(callParams); 
} 
catch (CreateCallExceptionType ccEx) 
{  
    _callService.UpdateCallState(call, CallState.Disconnected, CallOutcome.Failed); 
} 
catch (Exception ex) 
{  
    //do something 
} 

然後你可以在方法中處理UpdateCallState異常。

+0

那麼這是一個問題的正確答案。雖然沒有這個...... – 2012-04-02 17:13:56

0

在Catch塊中拋出異常不是一個好習慣。

try, Catch建議

try 
{ 
//make some changes. If something goes wrong go to Catch. 
} 

Catch(exception) 
{ 
//I will clean the mess. Rollback the changes. 
} 

捕獲異常,只有當你可以處理異常。除此之外,讓呼叫者決定如何處理異常。