多次尝试或一次?

时间:2010-07-13 17:46:30

标签: exception-handling

通常情况下,我会这样做:

try
{
    code

    code that might throw an anticipated exception you want to handle

    code

    code that might throw an anticipated exception you want to handle

    code
}
catch 
{

}

这样做有什么好处吗?

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code

更新

我最初问这个问题是否引用了C#,但正如A. Levy评论的那样,它可以应用于任何异常处理语言,所以我让标签反映了这一点。

11 个答案:

答案 0 :(得分:69)

这取决于。如果要为特定错误提供特殊处理,请使用多个catch块:

try
{ 
    // code that throws an exception
    // this line won't execute
}
catch (StackOverflowException ex)
{
    // special handling for StackOverflowException 
}
catch (Exception ex)
{
   // all others
}

但是,如果意图是处理异常并继续执行,请将代码放在单独的try-catch块中:

try
{ 
    // code that throws an exception

}
catch (Exception ex)
{
   // handle
}

try
{ 
    // this code will execute unless the previous catch block 
    // throws an exception (re-throw or new exception) 
}
catch (Exception ex)
{
   // handle
}

答案 1 :(得分:12)

如果我可以选择第二个,我可能会把它分成两个函数。

答案 2 :(得分:11)

两者都没有,只使用多个catch块来处理特定的异常(除非块中只有大量的代码,只有几行可能会抛出异常。在这种情况下,我会使用第二种方法)。

答案 3 :(得分:6)

你正在以错误的方式思考这个问题。在catch块中你需要做什么?如果您通过运行相同的代码中恢复任何可能的异常,无论哪个操作引发了异常,那么使用一个catch块。如果你需要根据投掷的操作进行不同的清理操作,那么使用多个catch块。

另外,如果您可以使用try / finally或RAII模式而不是try / catch,那么您应该这样做。

答案 4 :(得分:4)

我认为第二种方法更好,因为它可以让您更准确地捕获错误。

将整个代码包装在一个大的try / catch块中也是不好的,如果你的应用程序遇到某种问题并且它崩溃但是由于你遇到了一个大的通用execption,你可以正确处理它的机会更低。 你应该在try catch中有spesfic部分,就像你读取文件或接受用户输入一样。这样你就可以更好地处理这种异常

答案 5 :(得分:2)

我更喜欢第二种方法 - 它使调试更容易,错误处理更准确,并且也可以很好地提供给您的单元测试。

答案 6 :(得分:2)

我会选择第二个选项,但每当我看到这个代码模式时,我的第一感觉就是考虑将它分成多个函数/方法。显然,这样做取决于代码的作用;)

答案 7 :(得分:2)

这取决于代码中发生的错误类型的性质。

  1. 如果你要做的那些错误的处理是相同的,那么单个try ... catch代表那组代码。否则它太繁琐了。

  2. 如果错误需要不同的处理,请将其分开,因为必须使用。

  3. 不要为所有情况应用单一方法。编程大部分时间都是具体的背景:)

    您需要达到“GOOD / COMPLEX”和“BAD / SIMPLE”的平衡。你的代码越多,你就越不会陷入这种困境:)

    快乐的节目!

答案 8 :(得分:1)

第二种方法。保持可能抛出异常的代码与其他代码分开 - 使该部分更小,更易于管理,而不是包装所有代码,甚至是不会抛出异常的代码。

答案 9 :(得分:1)

我们有时间想向用户显示特定的错误。

try{
   try{
      ... send message
   }
   catch(exception e){
    ...log error
    ...rethrow  send related error/show custom error
   }
   try{
       ...try to receive response
   }
   catch(exception e){
       ...show receive related error
   }
   //finally close the connection
   }finally{
        ...close connection
   }

答案 10 :(得分:0)

第二种方式,但理想情况下使用代码保护 - 尝试/捕获是昂贵的