我想知道,将good practice
放入complete code
或try 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 ++编码
答案 0 :(得分:5)
一般来说,您应该仅捕获您感兴趣的异常以及您可以处理的异常。那是......抓住一个可以做某事的例外情况。用户没有察觉到问题或者明确有必要告诉用户有关问题的信息 对于所有其他异常,让他们弹出你明显记录的所有细节(堆栈跟踪等)。注意,显然这并不意味着用户也应该看到异常输出而是一般错误。
告诉我,我假设当你编写“OneException的代码机会”时,你知道如何处理OneException,但不是Exception,对吧?那么......只处理OneException。
答案 1 :(得分:3)
始终抓住你所拥有的,而不是更多。无论我们尝试多少,我们都无法使我们的代码完全“白痴证明”。如果有人通过了会导致一些随机错误的事情,那么处理它就是他们的工作。如果我们的代码处理其他人的异常,那么就会有太大的意外副作用风险。
至于放在哪里的代码:可以抛出Exception的行之前的代码将以任何一种方式运行,因此将它放在try块中并且之前没有意义抛出的代码。当且仅当它依赖于异常生成代码时,应该在try和catch之间放置潜在异常之后的代码。因此,如果数据库连接调用失败,请将所有数据库查询放在try块中。
限制尝试中使用的“时间”...捕获使其更容易阅读,更不容易意外捕获。我不能告诉你已经失去了多少小时,因为有人决定捕获一个应该传播的异常。
答案 2 :(得分:1)
a)将完整代码放在try块中是不好的做法。
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
结合使用。所有。