if-condition vsexception处理程序

我有一个问题:

“你更喜欢什么,例外处理或条件?”

接受采访 我的回答是exception处理程序仅在特殊情况下首选,例如文件写入时的磁盘权限错误。 面试官似乎期待一些其他答案。 什么是正确的答案?

编辑:当if条件更合适时,常用exception处理的任何特定示例?

由于此问题标记为“C#”,因此我们可以将.NET Framework设计指南作为回答这些类型问题的良好起点。 这是MSDN在“Exception Throwing”下给出的指导:

如果可能,不要将exception用于正常的控制流程。 除了系统故障和具有潜在竞争条件的操作之外,框架设计者应该设计API,以便用户可以编写不会抛出exception的代码。 例如,您可以提供一种在调用成员之前检查前提条件的方法,以便用户可以编写不会抛出exception的代码。

以下是一个错误做法的示例,其中处理exception但几乎总是可以避免:

public int? GetItem(int index) { int? value = null; try { value = this.array[index]; } catch (IndexOutOfRangeException) { } return value; } 

这似乎是人为的,但我经常从新的程序员那里看到这样的代码。 假设对array读写正确同步,可以100%确定地避免此exception。 鉴于此,编写该代码的更好方法如下:

 public int? GetItem(int index) { int? value = null; // Ensure the index is within range in the first place! if (index >= 0 && index < this.array.Length) { value = this.array[index]; } return value; } 

在其他情况下,您无法合理地避免exception,只需要处理它们。 当您必须处理外部资源(例如文件或网络连接)时,最常遇到的情况是您可能无法随时访问或联系。 来自WCF的示例:

 public void Close() { // Attempt to avoid exception by doing initial state check if (this.channel.State == CommunicationState.Opened) { try { // Now we must do a (potentially) remote call; // this could always throw. this.channel.Close(); } catch (CommunicationException) { } catch (TimeoutException) { } } // If Close failed, we might need to do final cleanup here. if (this.channel.State == CommunicationState.Faulted) { // local cleanup -- never throws (aside from catastrophic situations) this.channel.Abort(); } } 

即使在上面的示例中,最好检查您要执行的操作是否至少有成功的机会 。 所以仍然有一个if ()检查,然后是相应的exception处理逻辑。

就性能而言,exception处理是一项繁重且昂贵的操作。 如果您可以通过使用适当的if来避免捕获exception,那么可以提高应用程序的性能

另一方面,如果else块对代码阅读器更有意义。 与特殊的try catch块相比,它们易于理解和维护。 他们以更优雅的方式描述程序流程

最后,正如您所说,exception处理应该是针对不确定的情况,或者对于特殊情况,它不应该是默认选择

编辑

我在某些地方看到的常见坏习惯就是这样

  try { string str = "Some String" int i = Convert.ToInt32(str); } catch (Exception ex) { MessageBox.Show("Invalid input"); } 

现在尝试使用if else可以很容易地避免使用if

  string str = "Some String" int i; if(!int.TryParse(str, out i)) { MessageBox.Show("Invalid input"); } 

正确答案就是你给出的答案。

为了更具体,你应该说“由于捕获和抛出exception的开销,我尽可能使用if语句”。

我通常更喜欢使用一些特殊的未定义值(例如对象为null)来指示由于输入无效,某些计算无法产生有效结果。 这意味着我的代码可以成功确定并报告输入数据无效,并且无法生成有意义的结果。

当我的代码无法完成所请求的计算时,我更喜欢使用exception,例如,如果包含某些必需数据的文件不存在,如果它无法连接到数据库。

所以从概念上讲:

  • 未定义的结果 (加上if-condition):程序成功确定给定输入没有有效输出。
  • exception (加上try-catch):由于与输入无关的应用程序中的某些错误,程序无法完成计算。

如果您知道程序的确切登录并知道可能发生的错误,那么您可以编写if-else语句,或者在其他情况下,您可以留下一些东西来尝试捕获exception处理。