2013-10-15 122 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看到的(大多数)例外列表。