try / catch块中的完整代码

时间:2011-07-28 09:13:14

标签: c++ java

我想知道,将good practice放入complete codetry block放置是only the code which I feel it will cause a specific exception吗? 我应该抓住基本的Exception总是

代码1 :try block中的完整代码

myFunction(){
 try{
   .........
   Code with chance of OneException 
   .............
 }catch(OneException e){
  ............
 }catch(Exception e){
   ..............
 }
}

代码2 :仅在try block中有可能出现异常的代码

myFunction(){
  .......
  try{
   Code with chance of OneException 
  }catch(OneException e){
  ............
  }
  ............
}

代码3 :我应该始终抓住异常

    myFunction(){
      .......
      try{
       Code chance of OneException 
      }catch(OneException e){
      ............
      }catch(Exception e){
       ..............
      }
      ........
   } 

除此之外(code1,code2和code3)哪一个最好?
我主要关注java和C ++编码

5 个答案:

答案 0 :(得分:5)

一般来说,您应该仅捕获您感兴趣的异常以及您可以处理的异常。那是......抓住一个可以做某事的例外情况。用户没有察觉到问题或者明确有必要告诉用户有关问题的信息 对于所有其他异常,让他们弹出你明显记录的所有细节(堆栈跟踪等)。注意,显然这并不意味着用户也应该看到异常输出而是一般错误。

告诉我,我假设当你编写“OneException的代码机会”时,你知道如何处理OneException,但不是Exception,对吧?那么......只处理OneException。

答案 1 :(得分:3)

始终抓住你所拥有的,而不是更多。无论我们尝试多少,我们都无法使我们的代码完全“白痴证明”。如果有人通过了会导致一些随机错误的事情,那么处理它就是他们的工作。如果我们的代码处理其他人的异常,那么就会有太大的意外副作用风险。

至于放在哪里的代码:可以抛出Exception的行之前的代码将以任何一种方式运行,因此将它放在try块中并且之前没有意义抛出的代码。当且仅当它依赖于异常生成代码时,应该在try和catch之间放置潜在异常之后的代码。因此,如果数据库连接调用失败,请将所有数据库查询放在try块中。

限制尝试中使用的“时间”...捕获使其更容易阅读,更不容易意外捕获。我不能告诉你已经失去了多少小时,因为有人决定捕获一个应该传播的异常。

答案 2 :(得分:1)

  • a)将完整代码放在try块中是不好的做法。

    • a1)除了捕获异常之外,try-block是一个可能发生异常的文档。所以把它放在原因附近,你要记住。
    • a2)在糟糕的情况下,你有一个用于阅读的文件,稍后再添加一个用于写入,但你的异常(FileNotFoundException)只是考虑到了第一个。围绕有问题的地方的精益范围将帮助您,识别进一步的问题。
  • b)不要为了完整性或避免多个catch块而捕获基本Exception。如果你想写一个文件,很多东西都可能出错:缺少权限,非法文件名,设备上没有剩余空间,.......如果您向用户显示通用消息(“无法写入文件”+名称),则他不知道该怎么做。尽可能具体,你可以告诉他,“设备上只剩下20 MB”+ devicename +“我们需要另外8 MB(总共28 MB);请释放一些空间并重复或选择其他设备!”) 。如果你捕获“异常”,很可能是你正在考虑一些异常,但是会发生另一个异常,并且没有正确处理,因为catch-block并没有考虑到这种可能性。 找到此异常的最佳机会是,如果定期控制日志,则弹出或记录它。

开发最终用户简单使用的应用程序或开发其他开发人员使用的API可能会有所不同。 在API中,您经常希望将异常包装到自己的异常中,以使api的用户更容易处理它,以及是否有统一的方法来处理异常。如果您的代码可能抛出许多异常,并且会导致丑陋的客户端代码,您的客户需要一遍又一遍地指定一堆异常,您通常会将异常包装起来并重新抛出它们:

try  {
...
}
catch {FileNotFoundException fnfe}
{
    throw new MyApiException (fnfe);
}
catch {PermissionDeniedException pde}
{
    throw new MyApiException (pde);
}
catch {IOException  ioe}
{
    throw new MyApiException (ioe);
}

这样,您的客户可以决定如何处理异常,并且如果感兴趣,将在您的异常中找到特定类型的异常。

正如Landei指出的那样,在Java 7中,将会有一种简化的技术来捕获多个异常,但不仅仅是使用一个共同的超类,请参阅this link here

答案 3 :(得分:1)

将代码包装在您真正可以处理异常的位置,以及您可以处理错误的位置。如果你无法处理函数中的错误,那么不要在try / catch块中包装代码。

我不知道java,但在c ++中你应该通过const引用来捕获:

try
{
  // code that can throw an exception
}
catch ( const SomeExceptionType & error )
{
  // handle the error
}

答案 4 :(得分:1)

C ++不是Java或C#或......您需要catch(或finally)条款来清理自己。在C ++中,RAII就是这样做的。因此,我很少在C ++中编写try / catch语句,以至于我认为它是代码味道。

因此,您应该问自己是否需要try / catch,而不是考虑将哪种代码与try / catch结合使用。所有。