捕获数据库错误详细信息

时间:2013-10-15 17:40:08

标签: c# sql-server entity-framework

我想要一种更好的方法来捕获数据库错误详细信息。 我目前正在使用:

try
{

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

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

我多次发现Exception ex无法向我提供有关异常如何发生的详细信息。

我认为这些异常最有可能是数据库连接类型。

那么有更好的方法来捕捉这个吗?

4 个答案:

答案 0 :(得分:1)

您还应该输出异常。大多数情况下,它包含有用和详细的信息(例如违反约束的名称)。试试这个:

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

有关完整的详细信息,请使用ToString()方法,它也会为您提供堆栈跟踪,而不仅仅是错误消息。

答案 1 :(得分:1)

使用Console.WriteLine(ex.GetType().FullName)(或设置断点并在调试器下运行)以查看抛出的实际异常类型。然后访问MSDN以查看其描述和基类。您需要确定哪些基类为您提供了公开此类属性所需的信息。然后在catch()表达式中使用该类。

对于Entity Framework,您可能最终使用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);
}

答案 2 :(得分:1)

而不是Exception使用SqlException。 SqlException为您提供更多详细信息。它有一个Number属性,指示错误类型,您可以在切换案例中使用该号码向用户提供一些相关信息。

答案 3 :(得分: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查看(大多数)例外列表。