我的问题很模糊:o) - 但这是一个例子:
当我编写C代码时,我能够在出现故障时记录计数器的值:
<...> for ( int i = 0 ; i < n ; i++ ) if ( SUCCESS != myCall()) Log( "Failure, i = %d", i ); <...>
现在,使用异常,我得到这个:
try { <...> for ( int i = 0 ; i < n ; i++ ) myCall(); <...> } catch ( Exception exception ) { Log( "Failure ! Maybe in myCall() ? Don't know. i's value ? No clue." ); }
当然,可以在try/catch语句之外声明"i"(这就是我正在做的事情).但我不喜欢它 - 我喜欢声明变量在哪里使用,而不是之前.
但也许我在这里遗漏了一些东西.你有什么优雅的解决方案吗?
预先感谢 !西尔万.
ADDED:myCall()是一个不起眼的API调用 - 我不知道它可以抛出什么.另外,我当然可以在每个调用周围添加一个Try/Catch块,但是我会更好地使用返回码?那么我会在重要的代码行周围添加很多噪音吗?
怎么样:
for(int i = 0; i < n; i++) { try { myCall(); } catch(Exception e) { Log(String.Format("Problem with {0}", i)); } }
我不喜欢"现在,有例外......"的表达方式.
例外是您在编程中使用它的工具 - 如果您认为它是最佳选择,请使用它,否则不要.
我遵循个人规则,不会抛出任何我可以避免抛出的异常内部代码.对于公共可用DLL的API,应该启用前置条件检查,如果它们失败则触发异常,是; 但对于内部逻辑,我很少(如果有的话)在我的设计中包含异常.相反,当我使用某些函数时,如果发生某些不良情况,它会抛出它,我倾向于立即捕获异常 - 毕竟这是一个预期的异常.
如果你认为你的非特殊选择更好 - 坚持下去!
我认为你错了,这并不像许多其他人那样令人惊讶.
例外不能用于程序流程.再读一遍,这很重要.
例外情况是"你不应该发生的那个"错误,你希望在运行时永远不会看到这些错误.显然你会在第一个用户使用它时看到它们,这就是为什么你必须考虑它们可能发生的情况,但是你仍然不应该尝试将代码放入捕获,处理和继续,好像什么也没发生过一样.
对于这样的错误,您需要错误代码.如果你使用异常就好像它们是"超级错误代码"那么你最终会像你提到的那样编写代码 - 在try/catch块中包装每个方法调用!你还不如返回一个枚举,而不是,它是一个很大更快,显著更易于阅读比垃圾一切错误返回码7行代码,而不是1(其也更可能是正确的代码太-看到erikkallen的答复)
现在,在现实世界中,通常情况下,方法会抛出异常,而不是它们(例如EndOfFile),在这种情况下,你必须使用"try/catch wrapper"反模式,但是如果您设计方法,请不要将异常用于日常错误处理 - 仅在特殊情况下使用它们.(是的,我知道很难让这种设计正确,但设计工作也很多)
是啊.2件事.
将try-catch块放在合理的位置.如果您对myCall的异常感兴趣(以及我的价值),那么请使用
for ( int i = 0 ; i < n ; i++ ) try { myCall(); } catch ( Exception exception ) { Log( "Failure, i = %d", i ); }
针对不同的错误抛出不同类的对象.如果您对财务处理中发生的逻辑错误感兴趣,请抛出finances :: logic_error,而不是std :: exception("error msg")或其他东西.这样你就可以捕捉到你需要的东西.