调用Console.WriteLine(ex.Message)以防止出现警告消息

时间:2009-06-29 02:22:51

标签: c# winforms exception-handling console.writeline

我们通常会在GUI(表单)等代码的上层捕获异常。

但我通常有这种代码

try
{
}
catch(Exception ex)
{
  Console.WriteLine(ex.Message);
  MessageBox.Show("Application has encountered error....");
}

我可以在没有标识符的情况下捕获(Exception)因为我在运行时不需要消息,但是对于调试构建,确保在catch语句中断开是很方便的。所以我通常会编写一个Console.WriteLine来防止对未使用的ex变量发出很多警告。我的代码中有很多Console.WriteLine(ex.Message)的情况。这种性价比会降低吗?

注意:更改了标题“Console.WriteLine(ex.Message)是否具有性能成本?” “调用Console.WriteLine(ex.Message)以防止警告消息”

6 个答案:

答案 0 :(得分:11)

这是1中的多个问题所以我会尝试展开它:

首先

try{
  ...
}
catch(Exception) 
{
}

完全有效的语法。添加Console.WriteLine(ex.Message)只是为了让事情在没有警告的情况下进行编译,这不是正确的做法。

其次

Console.WriteLine不是正确的诊断方法,请查看Trace.WriteLine或更好的Logging framework。当然,Console.Writeline有成本,成本不是太严重,但仍然会打电话,而且还有成本。

<强>第三

有时它会更好地崩溃,它会强迫你解决根问题,至少做一个Debug.Assert如果发生了一些非常糟糕的事情。

答案 1 :(得分:6)

您可以创建一个在调试模式下过滤掉的扩展方法。

public static Exception
{

    [Conditional("DEBUG")]
    public static void Dump( this Exception ex )
    {
        Console.WriteLine( ex.ToString() );
    }
}

甚至更好......

public static Exception
{
    public static void Log( this Exception ex )
    {
#if DEBUG
        Console.WriteLine( ex.ToString() );
#endif
        Logger.WriteLine( ex.ToString() );
    }
}

然后在您的代码中将Console.WriteLine( ex.ToString() )替换为ex.Log();

但是,一般情况下,异常本身比转储到控制台更具有性能问题。

答案 2 :(得分:3)

更好的选择可能是System.Diagnostics.Debug.WriteLine(ex)或System.Diagnostics.Trace.WriteLine(ex)。如果定义了DEBUG符号,则调试仅执行某些操作,而Trace仅执行定义TRACE的操作。默认情况下,您的发布版本不包含DEBUG符号。

答案 3 :(得分:2)

一切都有性能成本。问题是绩效成本是否显着。

在这种情况下,我认为更好的问题是输出在winforms应用程序中的位置,以及为什么你只显示ex.Message而不是ex.ToString()。为何放弃信息?

答案 4 :(得分:2)

为避免收到警告:“在catch语句中声明变量'ex'但从未使用过”,并且 还要查看与异常相关的信息,请执行以下操作:

try
{
    ...
}
catch(Exception)    // avoid warning
{
   // set break point inside exception
}

在异常中设置断点并查看其中的调试器变量$ exception Visual Studio(2008)中的快速监视窗口,本地窗口或监视窗口。

答案 5 :(得分:0)

在C#中,有一些成本在捕获异常时并非无关紧要。 自己测试一下,写下这样的东西:

  • 创建字符串列表
  • 在此列表中,将其中25%作为数字,其余为单个字母。
  • 运行for循环遍历每个列表并执行int foo =(int)myList [0]但将其包装在try / catch中。

将比率提高到50%,然后是75%,然后是100%。 100%会稍慢,但不会太多。

在这个特定的例子中,现实世界的答案是使用Int32.TryParse,但这会显示惩罚。