5

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

但我通常有这种代码

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

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

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

4

6 回答 6

11

这是 1 中的多个问题,因此我将尝试展开它:

首先

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

是完全有效的语法。添加一个 Console.WriteLine(ex.Message) 只是为了让东西在没有警告的情况下编译并不是正确的做法。

第二

Console.WriteLine 不是进行诊断的正确方法,请查看 Trace.WriteLine 或更好的是Logging framework。当然Console.Writeline是有代价的,代价不算太严重,但还是打个电话,也是有代价的。

第三

有时崩溃更好,它会迫使您修复根本问题,如果发生了非常糟糕的事情,至少要执行Debug.Assert 。

于 2009-06-29T02:30:15.463 回答
7

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

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();

但是,一般来说,异常本身比转储到控制台更多的是性能问题。

于 2009-06-29T02:30:54.290 回答
3

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

于 2009-06-29T02:30:02.763 回答
2

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

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

于 2009-06-29T02:28:21.160 回答
2

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

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

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

于 2010-01-05T21:45:03.110 回答
0

在 C# 中,捕获异常时的成本并非微不足道。自己测试一下,这样写:

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

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

在这个特定示例中,现实世界的答案是使用 Int32.TryParse 代替,但这向您展示了惩罚。

于 2009-06-29T02:32:19.700 回答