if-condition与异常处理程序

时间:2011-12-31 08:10:38

标签: c#

我得到了一个问题:

  

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

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

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

5 个答案:

答案 0 :(得分:23)

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

  

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

以下是错误做法的示例,其中处理了异常但几乎总是可以避免:

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

    return value;
}

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

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;
}

在其他情况下,您无法合理地避免异常,只需要处理它们。当您必须处理外部资源(如文件或网络连接)时,最常遇到这种情况,您可能会随时失去对其的访问权限或与之联系。 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 ()检查,然后是相应的异常处理逻辑。

答案 1 :(得分:10)

就性能而言,异常处理是一项繁重而昂贵的操作。如果你可以通过使用正确的if else来避免捕获异常,那么可以提高应用程序的性能

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

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

修改

我在某些地方看到的一个常见的不良做法是

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

现在尝试使用if else

在这个外壳中可以轻松避免
  string str = "Some String"
  int i;
    if(!int.TryParse(str, out i))
    {
       MessageBox.Show("Invalid input");          
    }

答案 2 :(得分:4)

正确答案就是你提供的答案。

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

答案 3 :(得分:2)

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

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

概念上说:

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

答案 4 :(得分:0)

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