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块时没有考虑到这种可能性。 找到此异常的最佳机会是,让它弹出,或者,如果定期控制日志,则记录它
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的用户,不是吗?;)我相信每一条规则都有例外。假设我把我的一些代码给了其他人,并且在代码中