C# 是不是;“坏的”;在.NET中使用try-catch进行流控制吗?

C# 是不是;“坏的”;在.NET中使用try-catch进行流控制吗?,c#,try-catch,C#,Try Catch,我刚刚在一个项目中发现: try { myLabel.Text = school.SchoolName; } catch { myPanel.Visible = false; } 我想和开发人员谈谈,然后再写这篇文章,说出现空异常(因为school理论上可能是空的,而不是myLabel)实际上会使计算机。然而,我想知道我是否记错了这条规则。显然,这不是try/catch的预期用途,但这是因为它违背了预期,还是因为性能考虑而不好?我觉得这很糟糕,但我想说的不仅仅是“那真的很糟糕”

我刚刚在一个项目中发现:

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

我想和开发人员谈谈,然后再写这篇文章,说出现空异常(因为
school
理论上可能是空的,而不是
myLabel
)实际上会使计算机。然而,我想知道我是否记错了这条规则。显然,这不是try/catch的预期用途,但这是因为它违背了预期,还是因为性能考虑而不好?我觉得这很糟糕,但我想说的不仅仅是“那真的很糟糕”。

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


对于无法预测的异常情况,应专门捕获异常,在这种情况下,只需简单检查学校是否可以为空,事实上,学校可能为空(因为标签未设置任何内容)。如果school为null并且不应该为null,那么它应该抛出自己的ArgumentNullException。

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


我认为代码中更糟糕的部分是,它甚至没有做任何异常。对于抛出异常的原因,没有日志记录,甚至没有解释。

您不应该仅仅因为异常是糟糕的设计而对控制流使用异常。这没有道理。例外情况适用于例外情况,而非正常流量。在这种情况下,性能可能不会成为问题,因为对于现代硬件上的大多数现代应用程序,您可能会整天抛出异常,用户不会注意到性能受到影响。但是,如果这是一个处理大量数据或做大量工作的高性能应用程序,那么是的,性能将是一个问题。

您完全正确,这是不好的。这是不好的,因为它违背了意图,因为它损害了绩效


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

抛出异常确实会对性能产生负面影响,请参阅

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


告诉你的开发者,任何黑猩猩都可以编写机器可以阅读的代码。好的代码是为人类编写的,而不是为机器编写的。如果null异常是您唯一担心的事情,那么它可能是用户代码中的一个bug——没有人应该尝试以这种方式将null分配给任何东西。改用
Assert()
语句。

在我看来,这很糟糕,因为if语句可以让它更清晰:

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

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

请查看“为什么不将异常用作常规控制流?”

我同意这里的每个人——这是一个可怕的想法

Java中有一些情况(我认为它们现在大部分已经消失了,但在外部库中可能仍有一些)要求您捕获某些“非异常”情况的异常

通常,在编写库代码(实际上是任何类)时,避免对任何可能避免的情况使用异常。如果可能没有设置名称字段,并且可能会导致write()方法中出现异常,请确保添加isValid()方法,这样您就不必在写入过程中捕捉异常,从而知道存在问题


(糟糕的Java代码补遗):这种“好”的编程风格实际上消除了Java中检查异常的任何需要,Java中的检查异常是最糟糕的。

应该是空字符串,而不是NULL。@BillyONeal,学校是一个对象,它有可能是空的,在这种情况下,异常就会发生。我认为如果你对它有技术性的了解,捕获异常是昂贵的部分。但这并不重要,性能上的打击是存在的。这就是我真正想问的:对编程的厌恶,或者从技术上说是好的,因为我们没有抛出异常+在.NET中,除非您获得堆栈跟踪,否则异常实际上并没有那么昂贵。在这个特定的场景中,很难证明此异常处理导致了性能问题。在很大范围内,它们并没有那么昂贵,但它们与if(null==myLabel)进行了比较。我希望我能给它一个+6,因为“好的代码是为人编写的,而不是为机器编写的。”!我得出的结论是,初级程序员和高级程序员之间的全部区别在于这句话。这或多或少就是我花了一上午时间搜索的内容——谢谢你的链接,但你可能应该解释一下你的链接是什么,或者为什么它是相关的,这样其他用户可能会阅读它。其他用户:这是一个链接,指向一个广受关注的问题,题为“为什么不使用异常作为常规控制流?”