Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ try/catch块中的完整代码_C++_Java - Fatal编程技术网

C++ try/catch块中的完整代码

C++ try/catch块中的完整代码,c++,java,C++,Java,我想知道,将完整代码放入try块中是一种良好做法,还是我应该只放入我认为会导致特定异常的代码? 我应该总是捕捉基本异常吗 myFunction(){ ....... try{ Code chance of OneException }catch(OneException e){ ............ }catch(Exception e){ .............. }

我想知道,将
完整代码
放入
try块
中是一种
良好做法
,还是我应该只放入
我认为会导致特定异常的代码

我应该总是捕捉基本异常吗

    myFunction(){
      .......
      try{
       Code chance of OneException 
      }catch(OneException e){
      ............
      }catch(Exception e){
       ..............
      }
      ........
   } 
代码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> ,一般来说,你应该<强>只捕获你感兴趣的异常,你可以处理< /St>>。也就是说,捕获一个例外情况,在这个例外情况下,您可以执行一些s.t.操作。用户没有察觉到问题,或者当明确需要将问题告知用户时。
对于所有其他例外情况,让它们弹出并显示所有您明显记录的详细信息(stacktrace等)。注意,显然这并不意味着用户也应该看到异常输出,而是一个一般错误


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

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

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

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

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

    • a1)除了捕获异常之外,try块是一个可能发生异常的文档。所以,把它放在靠近原因的地方,你已经记住了
    • a2)在糟糕的情况下,您有一个文件用于读取,然后添加一个文件用于写入,但您的异常(FileNotFoundException)只是在编写时考虑了第一个。围绕有问题的地方建立一个精益范围将帮助您确定进一步的问题
  • b) 为了完整性或避免多个catch块,不要捕获基本异常。若要写入文件,可能会出现许多问题:权限丢失、文件名非法、设备上没有剩余空间等等。如果您向用户显示一条通用消息(“无法写入文件”+名称),则用户不知道该怎么办。尽可能具体,您可以通知他,“设备上只剩下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所指出的,在Java 7中,将有一种简化的技术来捕获多个异常,但不仅仅是使用一个公共超类,请参见

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

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

try
{
  // code that can throw an exception
}
catch ( const SomeExceptionType & error )
{
  // handle the error
}
C++不是Java或C#或。。。您需要
catch
(或
finally
)子句在自己之后进行清理。在C++中,这样做。因此,我很少写过<代码>尝试< /COD> > />代码> catch < /Cord>语句,在C++中,我认为这是代码气味。p>
因此,与其考虑与
try
/
catch
一起使用哪种代码样式,不如问问自己是否需要
try
/
catch

C没有异常,也没有称为C/C++的语言,因此您应该删除
C
标记。最佳实践问题对于代码审阅来说是离题的。与代码审阅相比,它更像是堆栈溢出问题。我会投票支持迁移,但我没有足够的代表。幸好Java 7中的新多捕获。请看,50%的Java用户没有采用简化的for循环,而您正在谈论Java-7?也许你是这么早就采用scala的用户,不是吗?;)我相信每一条规则都有例外。假设我把我的一些代码给了其他人,并且在代码中