2016-05-07 66 views
0

我已經自學了C#,並且目前正在開發一個try catch塊。這是寫入數據庫。C#從數據庫查詢中降級的最佳方法

try 
    { 
     //Write to Database 
    } 
    catch (SqlException ex) 
    { 
     //report issue 
     //close connection 
    } 
    catch (Exception ex) 
    { 
     //report issue 
     //close connection 
    } 
    finally 
    { 
     //close connection 
    } 

是否還有其他異常需要檢查?

如果連接字符串失敗,我還應該檢查嗎?

或者SQLException是否足夠好呢?

+0

而不是顯式關閉'finally'中的連接,而只是將連接放入'using'塊中。另外,如果你在finally中關閉了它,你不需要在'catch'中關閉它,即使你去了catch塊,finally也會繼續運行。 –

回答

2

如果你把周圍的SqlConnectionSqlCommandusing塊,SqlDataReader(如適用),那麼你並不需要一個明確的try/catch,以確保任何被處置。

using(var connection = new SqlConnection(connectionString) 
using(var command = new SqlCommand(procedureName, connection) 
{ 
    //etc 
} 

具體回答你的問題有關捉住SqlExceptionException,答案是 - 是的,趕上SqlException第一如果你會做一些不同的東西爲SqlException與任何其他異常的結果。但你可能不會。可能沒有理由,所以不,我不打擾只爲SqlException單獨捕獲。只有在你需要的時候才能做到。

這留下了問題 - 你是否真的需要在這個方法中捕獲任何異常?答案可能不是。如果拋出異常,using將處置任何需要處理的內容,那麼這個異常就會冒泡到任何稱爲它的方法。在某些時候你會想要記錄它,但是你不需要在每個方法的每一層記錄。例如,如果它是一個WCF服務,則可以只記錄調用服務方法時拋出的異常。

有些情況下您需要捕捉異常,以便您可以採取不同的方式進行響應。也許你正在查詢幾個數據集,如果失敗了,你可以記錄錯誤並返回一個空的結果,而不是導致下游失敗。但這並不常見。

另外值得一看的是AOP - Aspect Oriented Programming。許多方法需要異常日誌記錄,但它不是那些類的功能。所以有很多方法可以保留大多數類和方法中無關但必要的代碼。我鏈接到PostSharp,但我個人使用Windsor,因爲它提供了依賴注入和攔截器,它們將方法調用與諸如異常處理之類的東西進行了包裝。

0

Exception類是grneric類,它將捕獲所有異常

相關問題