标准SQL的错误信息来安慰太含糊
问题描述:
有没有一种方法,使异常消息一点点在C#WinForms应用程序更精确的控制台显示器。如在,而不是仅仅;标准SQL的错误信息来安慰太含糊
A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
也许更喜欢Java的,
java.sql.SQLException: Closed Connection at
oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at
...
至少让我有什么可能是错误的想法。我确信有这种情况,但不知道:)
答
额外的信息基本上是.StackTrace
。如何精确它可以是取决于它是如何建成,PDB是否可用等
如果你只是这样做:
catch(Exception ex) {
Console.Error.WriteLine(ex);
}
你应该默认显示的信息类似的水平。基本上,ToString()
显示的不仅仅是.Message
。例如:
static void Main()
{
try {Throw();}
catch(Exception ex) {
Console.Error.WriteLine(ex);
}
}
public static void Throw()
{
throw new InvalidOperationException("oops");
}
显示:
System.InvalidOperationException: oops
at X.Throw() in c:\Users\Marc\Documents\Visual Studio 2012\Projects\ConsoleAp
plication1\ConsoleApplication1\Program.cs:line 30
at X.Main() in c:\Users\Marc\Documents\Visual Studio 2012\Projects\ConsoleApp
lication1\ConsoleApplication1\Program.cs:line 20
答
的SQLException已经包含了足够的信息
请看看在MSDN页面 (http://msdn.microsoft.com/it-it/library/system.data.sqlclient.sqlexception.aspx)
try
{
command.Connection.Open();
command.ExecuteNonQuery();
}
catch (SqlException ex)
{
for (int i = 0; i < ex.Errors.Count; i++)
{
errorMessages.Append("Index #" + i + "\n" +
"Message: " + ex.Errors[i].Message + "\n" +
"LineNumber: " + ex.Errors[i].LineNumber + "\n" +
"Source: " + ex.Errors[i].Source + "\n" +
"Procedure: " + ex.Errors[i].Procedure + "\n");
}
Console.WriteLine(errorMessages.ToString());
}
答
是的,当然它是:
try
{
/// your code goes here ...
}
catch(SqlException sex)
{
foreach(SqlError error in sex)
{
Console.WriteLine("{0}:{1} Error {2} State {3}: \"{4}\" at {5}@{6}",
error.Server, error.Source,
error.Number, error.State,
error.Message,
error.Procedure, error.LineNumber);
}
}
你明白吗? try
... catch
!
对于(少数)情况下是有效的没有一个try/catch块,你可以求助于全球处理器:Application.UnhandledException
的UI消息泵线程和AppDomain.UnhandledException
非UI线程。
请注意,“第一次机会异常”与查看实际异常并不完全相同;你在IDE中看到了吗?或在'catch'块? – 2013-03-11 08:32:54
在IDE的输出窗口 – mechanicum 2013-03-11 09:51:51
IDE的输出窗口(特别是第一次机会异常)与控制台输出不同;你几乎可以忽略 - 那*不是真实的*;这是一个“提醒”,可能会或可能不会在之后(与正在处理的)之间起泡。它没有显示太多的原因是(因为它不是真实的),它不会冒险做任何可能改变状态的事情,包括访问任何***成员(包括'.Message'等;属性是方法)。它唯一可以安全展示的是* type *信息。你在比较苹果和家用砖。 – 2013-03-11 09:58:00