有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在尝试/ catch块中完成C++代码

我想知道,是把good practice放在try block里面还是我应该把only the code which I feel it will cause a specific exception放在complete code里面
我应该总是捕捉基本异常吗

代码1:在try块中完成代码

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

代码2:只有在try块中可能发生异常的代码

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

代码3:我应该始终捕获异常吗

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

在这些(代码1、代码2和代码3)中,哪一个是最好的
我主要关注java和C++编码< /p>


共 (5) 个答案

  1. # 1 楼答案

    总是抓住你必须抓住的东西,而不是更多无论我们如何努力,我们都无法使代码完全“防白痴”。如果有人递给你一些会导致随机错误的东西,那么他们的工作就是处理它。如果我们的代码处理了其他人的异常,那么它有太多的风险成为意外的副作用

    至于要将什么代码放在何处:可能引发异常的行之前的代码将以任何方式运行,因此将其放在try块中,并在引发异常的代码之前是没有意义的。潜在异常之后的代码应该放在try和catch之间,当且仅当它依赖于生成异常的代码时。因此,如果数据库连接调用可能失败,请将所有数据库查询放在try块中

    限制花在尝试上的“时间”。。。catch使它更容易阅读,也不容易意外捕获。我无法告诉您由于某人决定捕获本应传播的异常而损失了多少小时

  2. # 2 楼答案

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

      • a1)除了捕获异常之外,try块是一个可能发生异常的文档。所以,把它放在靠近原因的地方,你已经记住了
      • a2)在糟糕的情况下,您有一个文件用于读取,然后添加一个文件用于写入,但您的异常(FileNotFoundException)只是在编写时考虑了第一个。围绕有问题的地方建立一个精益范围将帮助您确定进一步的问题
    • b)为了完整性或避免多个捕捉块,不要捕捉基本异常。若要写入文件,可能会出现许多问题:权限丢失、文件名非法、设备上没有剩余空间等等。如果您向用户显示一条通用消息(“无法写入文件”+名称),则用户不知道该怎么办。尽可能具体,您可以通知他,“设备上只剩下20 MB”+devicename+“我们还需要8 MB(总共28 MB);请释放一些空间,重复或选择其他设备!”)。如果捕获到“异常”,则很有可能您正在考虑某个异常,但另一个异常发生了,并且没有正确处理,因为编写catch块时没有考虑到这种可能性。 找到此异常的最佳机会是,让它弹出,或者,如果定期控制日志,则记录它

    这可能是开发应用程序(只供最终用户使用)与开发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所指出的,在Java7中,将有一种简化的技术来捕获多个异常,但不仅仅是使用一个公共超类,请参见this link here

  3. # 3 楼答案

    C++不是java或c++或…您需要catch(或finally)子句在您自己之后进行清理。在C++中,RAII这样做。因此,我很少在C++中写^ { CD3}/^ {< CD1}}语句,直到我认为它是代码气味。p>

    因此,与其考虑与try/catch结合使用哪种代码风格,不如问问自己是否需要这种try/catch

  4. # 4 楼答案

    一般来说,您应该只捕获您感兴趣并且可以处理的异常。那就是。。。捕捉一个异常,在该异常中,您可以执行一些s.t.操作。用户没有察觉到问题,或者当明确需要将问题告知用户时
    对于所有其他例外情况,让它们弹出所有详细信息(stacktrace等)很明显,你记录了。注意,显然这并不意味着用户也应该看到异常输出,而是一个一般错误

    说到这里,我假设当您编写“OneException代码”时,您知道如何处理OneException,但不知道如何处理异常,对吗?那么。。。只处理一个异常

  5. # 5 楼答案

    在真正能够处理异常和错误的地方包装代码。如果无法处理函数中的错误,则不要在try/catch块中包装代码

    我不知道java,但是C++中应该用const引用来捕获:

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