我们通常会在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)以防止警告消息”
答案 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#中,有一些成本在捕获异常时并非无关紧要。 自己测试一下,写下这样的东西:
将比率提高到50%,然后是75%,然后是100%。 100%会稍慢,但不会太多。
在这个特定的例子中,现实世界的答案是使用Int32.TryParse,但这会显示惩罚。