在尝试/ 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>
# 1 楼答案
总是抓住你必须抓住的东西,而不是更多无论我们如何努力,我们都无法使代码完全“防白痴”。如果有人递给你一些会导致随机错误的东西,那么他们的工作就是处理它。如果我们的代码处理了其他人的异常,那么它有太多的风险成为意外的副作用
至于要将什么代码放在何处:可能引发异常的行之前的代码将以任何方式运行,因此将其放在try块中,并在引发异常的代码之前是没有意义的。潜在异常之后的代码应该放在try和catch之间,当且仅当它依赖于生成异常的代码时。因此,如果数据库连接调用可能失败,请将所有数据库查询放在try块中
限制花在尝试上的“时间”。。。catch使它更容易阅读,也不容易意外捕获。我无法告诉您由于某人决定捕获本应传播的异常而损失了多少小时
# 2 楼答案
a)将完整的代码放在try块中是不好的做法
b)为了完整性或避免多个捕捉块,不要捕捉基本异常。若要写入文件,可能会出现许多问题:权限丢失、文件名非法、设备上没有剩余空间等等。如果您向用户显示一条通用消息(“无法写入文件”+名称),则用户不知道该怎么办。尽可能具体,您可以通知他,“设备上只剩下20 MB”+devicename+“我们还需要8 MB(总共28 MB);请释放一些空间,重复或选择其他设备!”)。如果捕获到“异常”,则很有可能您正在考虑某个异常,但另一个异常发生了,并且没有正确处理,因为编写catch块时没有考虑到这种可能性。 找到此异常的最佳机会是,让它弹出,或者,如果定期控制日志,则记录它
这可能是开发应用程序(只供最终用户使用)与开发API(供其他开发人员使用)之间的区别。 在API中,您通常希望将异常包装到自己的异常中,以便API的用户更容易处理它,并且如果您有统一的方法来处理异常。如果您的代码会抛出许多异常,并导致客户代码变得丑陋,您的客户需要反复指定一组异常,那么您通常会包装异常并重新显示它们:
这样,您的客户机就可以决定如何处理异常,并在您的异常中找到特定类型的异常(如果感兴趣)
正如Landei所指出的,在Java7中,将有一种简化的技术来捕获多个异常,但不仅仅是使用一个公共超类,请参见this link here
# 3 楼答案
C++不是java或c++或…您需要
catch
(或finally
)子句在您自己之后进行清理。在C++中,RAII这样做。因此,我很少在C++中写^ { CD3}/^ {< CD1}}语句,直到我认为它是代码气味。p>因此,与其考虑与
try
/catch
结合使用哪种代码风格,不如问问自己是否需要这种try
/catch
# 4 楼答案
一般来说,您应该只捕获您感兴趣并且可以处理的异常。那就是。。。捕捉一个异常,在该异常中,您可以执行一些s.t.操作。用户没有察觉到问题,或者当明确需要将问题告知用户时
对于所有其他例外情况,让它们弹出所有详细信息(stacktrace等)很明显,你记录了。注意,显然这并不意味着用户也应该看到异常输出,而是一个一般错误
说到这里,我假设当您编写“OneException代码”时,您知道如何处理OneException,但不知道如何处理异常,对吗?那么。。。只处理一个异常
# 5 楼答案
在真正能够处理异常和错误的地方包装代码。如果无法处理函数中的错误,则不要在try/catch块中包装代码
我不知道java,但是C++中应该用const引用来捕获: