标准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 
... 

至少让我有什么可能是错误的想法。我确信有这种情况,但不知道:)

+1

请注意,“第一次机会异常”与查看实际异常并不完全相同;你在IDE中看到了吗?或在'catch'块? – 2013-03-11 08:32:54

+0

在IDE的输出窗口 – mechanicum 2013-03-11 09:51:51

+1

IDE的输出窗口(特别是第一次机会异常)与控制台输出不同;你几乎可以忽略 - 那*不是真实的*;这是一个“提醒”,可能会或可能不会在之后(与正在处理的)之间起泡。它没有显示太多的原因是(因为它不是真实的),它不会冒险做任何可能改变状态的事情,包括访问任何***成员(包括'.Message'等;属性是方法)。它唯一可以安全展示的是* type *信息。你在比较苹果和家用砖。 – 2013-03-11 09:58:00

额外的信息基本上是.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线程。