使用C#try / catch / finally表现得像if / else的最佳方法是什么?

时间:2011-07-28 20:11:02

标签: c# exception try-catch

我正在尝试将try / catch / finally设置为if / else。我不确定做这件简单事情最优雅的方法。

public bool login()
{
bool isLoggedIn = false;
if (connectToServer(Path,username,password) ) // if successful
  {
     isLoggedIn = true;
  }
  else
  {

  }

return isLoggedIn;
}

以下是我尝试使用例外的内容。

public bool login()
{
 bool isLoggedIn = false;

 try{
    connectToServer(Path,username,password)
    isLoggedIn = true; 
  }
  catch(myConnectionException ex)
  {


  }

return isLoggedIn;
}

第二行“isLoggedIn”将被执行,尽管前一行在失败时引发异常。我的想法是问“如果抛出一个异常,我不希望该行被执行。我可以(我应该)在此时访问异常对象进行测试吗?(或者它是否超出范围?)我是一个前C编码器所以我试图“保持c#”来做一件简单的事情。我只想完善自己的技能并与“最佳实践”保持一致。 谢谢 DTM

6 个答案:

答案 0 :(得分:10)

不,它不会被执行。但是,这是不好的做法,因为处理异常需要进行昂贵的上下文切换。您只应在例外案例中使用例外。

我会考虑将这两种方法结合起来。

答案 1 :(得分:4)

做这样的事情会有什么问题?

bool isLoggedIn = false;

try
{
    isLoggedIn = connectToServer(Path, username, password);
}
catch (ExceptionType1 ex1)
{
    //Recover from this exception type.
}
catch (ExceptionType2 ex2)
{
    //Recover from this exception type.
}

异常不是if语句的“替代”。它们用于处理错误条件,如果应该发生,并且使用它们来控制应用程序的流程当然是不可取的。至少它们很慢,并且使用它们来控制流程可能会在您实际希望应用程序失败时隐藏您的实际真实错误。

编辑: 正如@Anthony Pegram在下面的评论中提到的,处理单个catch块中的所有异常类型是不好的做法(我经常犯这样的事情),因为它也隐藏了你可能真正想要特别处理的异常

答案 2 :(得分:0)

connectToServer如果不成功则应该myConnectionException

答案 3 :(得分:0)

我强烈建议将try / catch块移动到connectToServer。你永远不应该控制带有异常的程序流,如上所述,上下文切换是可怕的开销。

让connectToServer始终返回true或false(让它在内部捕获它的错误并返回false)。简单地说:

return connectToServer(Path,username,password);

答案 4 :(得分:0)

在这个简单的例子中

isLoggedIn = true;
如果抛出异常,则未到达

,因此如果连接调用抛出异常,则仍然为false(初始化)。即使它不是catched异常类型,也永远不会达到设置isLoggin为true的部分。

如前所述:不要使用异常而不是if / then / else或switch / case。如果你的代码在将isLoggedIn设置为true后有更多的方法调用,那么你应该将它重置为false,因为在catch中因为这将是返回的结果。

顺便说一下,在c#或i c ++中使用异常的规则没有区别。这对两种语言来说都很常见。

答案 5 :(得分:-1)

这样可行,但不应该这样做。您最好的选择是将其编码为:

public bool login()
{
    return connectToServer(Path,username,password);
}

短而甜蜜。除特殊情况外,例外情况非常糟糕。当然,如果你想获取connectToServer异常,那么你可以使用类似的东西:

public bool login()
{
    try
    {
        return connectToServer(Path,username,password);
    }
    catch(exception ex)//or the specific exception you are after
    {
        return false;
    }
}

意味着失败的特殊情况将被异常所取代,但大多数情况下不会调用异常。