0

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

try
{

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

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

很多时候,我发现Exception ex 无法详细说明异常是如何发生的。

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

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

4

4 回答 4

1

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

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

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

于 2013-10-15T17:48:54.103 回答
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);
}
于 2013-10-15T17:50:07.170 回答
1

而不是Exception使用 SqlException。SqlException 给你更多细节。它具有指示错误类型的Number属性,您可以在 switch case 中使用该 Number 向用户提供一些相关信息。

于 2013-10-15T17:51:37.067 回答
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 查看(大多数)异常列表。

于 2013-10-15T17:54:43.860 回答