2016-10-06 30 views
0

在下面的代碼中,我有一個嵌套的Try Catch。在我的嵌套catch失敗的情況下,我只想對父catch語句執行該代碼。我怎樣才能做到這一點?如何從嵌套Catch語句中轉義

try 
    { 
    try 
    { // build and send invoice lines 
     ReadInvLinesToArray(row["ID_INVOICE"].ToString()); 
    } 
    catch (Exception e) 
    { 
     writeToEventLog(e.ToString(), true, false); 
     SendErrorEmail("Failed to send Invoice Lines to NAV. The following system error was generated: \n" + e.ToString()); 
    } 
    // send invoice header if lines have been sent 
    bool result = navInvoices.SendInvoicesToNAV(navImportInvoices); 
    // update the retrieved records, marking QB Status as value N, passing in the sql dataset as a list   
    UpdateQBStatusInvoiceSent(ref idInvoicesSent); 
    } 
catch (Exception e) 
    { 
    // remove Invoice from list to ensure its status is not updated. 
    idInvoicesSent.Remove(Convert.ToInt32(row["ID_INVOICE"])); 

    WriteToEventLog(e.ToString(), true, false); 
    SendErrorEmail("Failed to send Invoices to NAV. The following system error was generated: \n" + e.ToString()); 
    } 
+2

你是什麼意思失敗?你的意思是在內部捕獲中拋出異常?如果發生這種情況,那麼流程會轉到外部catch以處理該異常。 但是在外部catch中,您運行的是與內部catch相同的2個語句,因此如果內層失敗,爲什麼外層不會失敗呢? – KMoussa

+0

外部異常將撤消對數據庫的一些修改。內部try catch與child記錄一起使用,而外部handle處理Parent記錄。如果內部失敗,那麼我需要回滾我的父記錄修改。我會修改正在發送的電子郵件。 – Gavin

回答

3

您與「內部」 catch捕捉到的異常,所以異常已被處理。如果你想讓「外部」catch觸發,你必須重新拋出異常:

try { 
    try { 
    ... 
    } catch (Exception e) { 
     ... do stuff 
     throw e; // you need this 
    } 
} catch (Exception e) { 
    ... catch the re-thrown "e" 
} 
+2

爲什麼不只是'拋出',根據[這個問題](http://stackoverflow.com/questions/22623/best-practices-for-catching-and-re-rowrow-net-exceptions)? – stuartd

+0

非常好。非常感謝。我會在9分鐘內接受。我不明白爲什麼必須將問題投下來。 – Gavin

+0

Marc,我的嵌套try catch有代碼發生在那之後,但仍在父親嘗試的範圍內。我在我的嵌套catch中使用throw。這會立即跳出到父節點,還是執行嵌套(拋出)catch之後的代碼,但仍在嘗試中?我的代碼行 bool result = navInvoices.SendInvoicesToNAV(navImportInvoices); 似乎仍在執行。 – Gavin