当前位置:  开发笔记 > 编程语言 > 正文

例外与返回代码:我们是否会丢失一些东西(同时获得其他东西)?

如何解决《例外与返回代码:我们是否会丢失一些东西(同时获得其他东西)?》经验,为你挑选了4个好方法。

我的问题很模糊: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块,但是我会更好地使用返回码?那么我会在重要的代码行周围添加很多噪音吗?



1> scottm..:

怎么样:

for(int i = 0; i < n; i++)
{
  try
  {
    myCall();
  }
  catch(Exception e)
  {
    Log(String.Format("Problem with {0}", i));
  }
}



2> Daniel Daran..:

我不喜欢"现在,有例外......"的表达方式.

例外是您在编程中使用它的工具 - 如果您认为它是最佳选择,请使用它,否则不要.

我遵循个人规则,不会抛出任何我可以避免抛出的异常内部代码.对于公共可用DLL的API,应该启用前置条件检查,如果它们失败则触发异常,是; 但对于内部逻辑,我很少(如果有的话)在我的设计中包含异常.相反,当我使用某些函数时,如果发生某些不良情况,它会抛出它,我倾向于立即捕获异常 - 毕竟这是一个预期的异常.

如果你认为你的非特殊选择更好 - 坚持下去!



3> gbjbaanb..:

我认为你错了,这并不像许多其他人那样令人惊讶.

例外不能用于程序流程.再读一遍,这很重要.

例外情况是"你不应该发生的那个"错误,你希望在运行时永远不会看到这些错误.显然你会在第一个用户使用它时看到它们,这就是为什么你必须考虑它们可能发生的情况,但是你仍然不应该尝试将代码放入捕获,处理和继续,好像什么也没发生过一样.

对于这样的错误,您需要错误代码.如果你使用异常就好像它们是"超级错误代码"那么你最终会像你提到的那样编写代码 - 在try/catch块中包装每个方法调用!你还不如返回一个枚举,而不是,它是一个很大更快,显著更易于阅读比垃圾一切错误返回码7行代码,而不是1(其也更可能是正确的代码太-看到erikkallen的答复)

现在,在现实世界中,通常情况下,方法会抛出异常,而不是它们(例如EndOfFile),在这种情况下,你必须使用"try/catch wrapper"反模式,但是如果您设计方法,请不要将异常用于日常错误处理 - 仅在特殊情况下使用它们.(是的,我知道很难让这种设计正确,但设计工作也很多)


认为你是对的.我读到了某个地方(务实的程序员?),当您删除所有异常处理代码时,您的代码仍然可以正常工作.也就是说,异常应该只是意外情况,而不是常见的错误处理.谢谢.

4> 小智..:

是啊.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")或其他东西.这样你就可以捕捉到你需要的东西.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有