我想要一种更好的方法来捕获数据库错误详细信息。 我目前正在使用:
try
{
dbconn.table.AddObject(newRow);
dbconn.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine("DB fail ID:" + Row.id);
}
我多次发现Exception ex
无法向我提供有关异常如何发生的详细信息。
我认为这些异常最有可能是数据库连接类型。
那么有更好的方法来捕捉这个吗?
答案 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查看(大多数)例外列表。