在.NET中使用try-catch进行流量控制是“糟糕的”吗?

时间:2009-08-26 16:47:53

标签: c# try-catch

我刚刚在一个项目中找到了:

try
{
    myLabel.Text = school.SchoolName;
}
catch
{
    myPanel.Visible = false;
}

我想与开发人员讨论,而不是写这个,说发生null异常(因为school理论上可能是空的,而不是myLabel)实际上会使计算机beep three times and sleep for two seconds。但是,我想知道我是否错过了关于这一点的规则。显然,这不是try / catch的预期用途,但这是不好的,因为它因性能考虑而无视意图或不好?我觉得这很糟糕,但我想说的不仅仅是“那真的很糟糕”。

9 个答案:

答案 0 :(得分:20)

您不应该仅仅因为设计不好而对控制流使用异常。这没有意义。例外是针对特殊情况,而不是正常流量。在这种情况下,性能可能不会成为问题,因为对于现代硬件上的大多数现代应用程序,您可以整天抛出异常,并且用户不会注意到性能损失。但是,如果这是一个处理大量数据或执行大量工作的高性能应用程序,那么是的,性能将是一个问题。

答案 1 :(得分:9)

在我看来,这很糟糕,因为if语句可以更清楚地说明:

if (school != null) {
    myLabel.Text = school.SchoolName;
}
else {
    myPanel.Visible = false;
}

这肯定会避免不必要地使用异常处理,并使代码的含义非常明显。

答案 2 :(得分:8)

我认为这很糟糕,因为它针对一个异常进行编码,并且还会继承不必要的开销。只有在以特定方式处理例外情况时才会被捕获。

应该专门针对您无法预测的例外情况捕获异常,在这种情况下,它是一个简单的检查,看看学校是否可以为null,实际上预计学校可能为空(因为标签没有设置)。如果school是null并且它不应该是它应该抛出自己的ArgumentNullException。

答案 3 :(得分:3)

异常会导致运行时开销,但这里可能忽略不计。在调试器中运行会有差异,但构建的二进制文件应该以几乎相同的速度运行。

告诉您的开发人员,任何黑猩猩都可以制作机器可以读取的代码。好的代码是为人类而不是机器编写的。如果一个null异常是你唯一担心的事情,那么它可能是用户代码中的一个错误 - 没有人应该尝试将null赋给任何方式。请改用Assert()语句。

答案 4 :(得分:2)

这是不对的,这是对的。这很糟糕,因为它违背意图 ,因为它会影响性能。

我意识到存在不同编程风格的空间,但就个人而言,我认为尽管这有效,但我可以看到代码试图做什么,它也会损害可读性和代码清晰度,使其变得更加困难为维护程序员遵循。 if语句在这里更合适。

答案 5 :(得分:2)

抛出异常会对效果产生负面影响,请参阅http://msdn.microsoft.com/en-us/library/ms229009(VS.80).aspx

答案 6 :(得分:1)

我从不喜欢使用流量控制的异常。异常是昂贵的,并且很难确定程序的实际流程是什么,其中异常被抛出以到达代码中的其他位置。对我来说这就像使用GoTo。这并不意味着你应该避免异常,而应该只是异常,这是程序中通常应该发生的异常。

我认为代码的一个更糟糕的部分是它甚至没有做任何异常的事情。没有记录甚至解释为什么抛出异常。

答案 7 :(得分:1)

请查看此post“为什么不将例外用作常规控制流?”

答案 8 :(得分:0)

我同意所有人的意见 - 这是一个可怕的想法。

在Java中有一些案例(我认为它们现在大部分已经消失,但在外部库中可能仍有一些案例),在这些案例中,您需要针对某些“非例外”案例捕获异常。

通常,在编写库代码(实际上是任何类)时,请避免使用可能可避免的ANYTHING异常。如果可能没有设置名称字段并且应该在write()方法中导致异常,请确保添加一个isValid()方法,以便您实际上不必捕获围绕写入的异常以便知道有一个问题。

(糟糕的Java代码附录):这种“好”的编程风格实际上消除了Java中对已检查异常的任何需求,并且Java中的已检查异常是Suck。