2013-10-15 45 views
0

我想要一個更好的方法來捕獲數據庫錯誤詳細信息。 我目前使用:Catch DB錯誤詳細信息

try 
{ 

    dbconn.table.AddObject(newRow); 
    dbconn.SaveChanges(); 

} 
catch (Exception ex) 
{ 
    Console.WriteLine("DB fail ID:" + Row.id); 
} 

很多次我發現Exception ex不能給我的異常是如何發生的細節。

我覺得這些異常最有可能是DB連接類。

那麼有沒有更好的方法來抓住這個?

+1

檢查應用程序中的約束(FK,約束,唯一約束),而不是將其生成給DB。 – Alireza

+0

是的。顯示ex.ToString(),它將告訴你所有需要了解的異常。 –

回答

1

您還應該輸出異常。大多數情況下,它會保存有用和詳細的信息(例如違反約束的名稱)。試試這個:

try 
{ 
    dbconn.table.AddObject(newRow); 
    dbconn.SaveChanges(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("DB fail ID:" + Row.id); 
    Console.WriteLine(ex.ToString()); 
} 

有關詳情,請使用ToString()方法,它會給你的堆棧跟蹤爲好,不僅是錯誤消息。

+0

另外,ToString()會遞歸地檢查內部異常。 – Lev

1

使用Console.WriteLine(ex.GetType().FullName)(或放置一個斷點並在調試器下運行)查看拋出的實際異常類型。然後訪問MSDN查看其描述和基類。您需要決定哪些基類爲您提供暴露這些屬性所需的信息。然後在你的catch()表達式中使用該類。

對於實體框架,您最終可能會使用EntityException,然後檢查InnerException屬性以查找其包裝的SQL異常對象。

try 
{ 
    dbconn.table.AddObject(newRow); 
    dbconn.SaveChanges(); 
} 
catch (EntityException ex) 
{ 
    Console.WriteLine("DB fail ID:" + Row.id + "; Error: " + ex.Message); 
    var sqlExc = ex.InnerException as SqlException; 
    if (sqlExc != null) 
     Console.WriteLine("SQL error code: " + sqlExc.Number); 
} 
1

而不是Exception使用SqlException。 SqlException給你更多的細節。它有一個指示錯誤類型的Number屬性,並且您可以在切換案例中使用該數字向用戶提供一些相關信息。

0

總之,是的,有更好的方法來處理它。 '怎麼'取決於你。

C#中的異常處理從最具體的例外類型變爲最不具體。此外,您不僅限於使用一個catch塊。你可以有很多。

舉個例子:

try 
{ 
    // Perform some actions here. 
} 

catch (Exception exc) // This is the most generic exception type. 
{ 
    // Handle your exception here. 
} 

上面的代碼是什麼,你已經有了。爲了顯示你可能想要的東西例如:

try 
{ 
    // Perform some actions here. 
} 

catch (SqlException sqlExc) // This is a more specific exception type. 
{ 
    // Handle your exception here. 
} 

catch (Exception exc) // This is the most generic exception type. 
{ 
    // Handle your exception here. 
} 

在Visual Studio中,可以通過按CTRL + ALT + E看到的(大多數)例外列表。