2013-04-03 71 views
0

對於我正在處理的應用程序,我的一位隊友一直在處理一個通用錯誤處理程序,該處理程序在我們的某個系統進入時執行一些報告給我們的團隊一個特殊的狀態,處於相對較高的水平。但是,幾個星期前,我在低級別(特別是數據庫訪問)編寫了一些代碼,提供了一些通知。隨着該團隊成員的高級代碼的出現,團隊的其他成員認爲我們可以安全地移除我的try/catch系統。隨後的命令執行成功捕獲到更高級別的異常

一個問題:從此特定存儲庫方法返回的數據結構上有一個IsSuccessful標誌。當異常發生時,這個標記維持虛假的(成功的數據採集,標誌設置爲true。)

所以,就目前而言,我的代碼看起來是這樣的:

public FooResult Foo() 
{ 
    FooResult result = new FooResult { IsSuccessful = false }; 
    SqlParameter[] args = new [] 
    { 
    // Some args, immaterial to the situation. 
    } 

    try 
    { 
    DataSet ds = SqlHelper.ExecuteDataset(_connection, CommandType.Text, query, args); 
    result = new FooResult 
      { 
       IsSuccessful = true, 
       // ...Other fields are set... 
      }; 
    } 
    catch 
    { 
    result.IsSuccessful = false; 
    throw; // Per request 
    } 

    return result; 
} 

導致到我的問題:拋出一個異常並在更高級別處理後,會發生什麼?我的代碼是否會回落到停止的位置,或者是否在其他地方恢復執行?當出現問題並在不同的層次上清理時,代碼繼續往哪裏走?

回答

1

拋出一個異常強制一個stack unwinding,這意味着當前的執行堆棧將被放棄,並最終最終結束,其中有一個catch()
這意味着,如果您在調用方法中捕獲exception,則最終將以ist catch() -handler結尾,並且您將不會返回到被調用方發生異常的位置。所以如果你有回報聲明,這永遠不會達到!

Here是一個很好的短文。

1

Foo()裏面創建的FooResult對象將永遠不會返回,如果您在那裏拋出異常。

異常會破壞代碼和泡泡的正常控制流,直到有人捕獲到異常或程序完全停止。

上級有可能會發現異常並重試,但這不在您方法的手中。

+0

你和bash.d都給出了很好的答案,但我接受了他,因爲他只提供了更多的信息。儘管非常感謝您花時間回答! – 2013-04-03 20:31:28