do-while-false 循环常见吗?

2024-01-10

不久前,我改变了处理 c 风格错误的方式。

我发现我的很多代码都是这样的:

int errorCode = 0;

errorCode = doSomething();
if (errorCode == 0)
{
   errorCode = doSomethingElse();
}

...

if (errorCode == 0)
{
   errorCode = doSomethingElseNew();
}

但最近我一直这样写:

int errorCode = 0;

do
{       
   if (doSomething() != 0) break;
   if (doSomethingElse() != 0) break;
   ...
   if (doSomethingElseNew() != 0) break;
 } while(false);

我见过很多代码在出现错误后什么都不执行,但它总是以第一种风格编写。还有其他人使用这种风格吗?如果没有,为什么?

Edit:只是为了澄清,通常这个结构使用errno否则我会将值分配给int在打破之前。此外,通常还有更多的代码,而不仅仅是一个函数调用if (error == 0 )条款。不过,有很多值得思考的好点。


如果您使用 C++,只需使用异常。如果您使用 C,第一种样式效果很好。但如果您确实想要第二种样式,只需使用 goto - 这正是 goto 真正是最清晰的构造的情况类型。

    int errorCode = 0;

    if ((errorCode = doSomething()) != 0) goto errorHandler;
    if ((errorCode = doSomethingElse()) != 0) goto errorHandler;
      ...
    if ((errorCode = doSomethingElseNew()) != 0) goto errorHandler;

    return;
errorHandler:
    // handle error

是的,goto 可能很糟糕,而异常或每次调用后的显式错误处理可能会更好,但 goto 比选择另一个构造来尝试和模拟它们要好得多。使用 goto 还可以轻松地为特定错误添加另一个错误处理程序:

    int errorCode = 0;

    if ((errorCode = doSomething()) != 0) goto errorHandler;
    if ((errorCode = doSomethingElse()) != 0) goto errorHandler;
      ...
    if ((errorCode = doSomethingElseNew()) != 0) goto errorHandlerSomethingElseNew;

    return;
errorHandler:
    // handle error
    return;
errorHandlerSomethingElseNew:
    // handle error
    return;

或者,如果错误处理更多的是“展开/清理你所做的事情”,你可以这样构造它:

    int errorCode = 0;

    if ((errorCode = doSomething()) != 0) goto errorHandler;
    if ((errorCode = doSomethingElse()) != 0) goto errorHandler1;
      ...
    if ((errorCode = doSomethingElseNew()) != 0) goto errorHandler2;

errorHandler2:
    // clean up after doSomethingElseNew
errorHandler1:
    // clean up after doSomethingElse
errorHandler:
    // clean up after doSomething
    return errorCode;

这种习惯用法的优点是不重复清理代码(当然,如果您使用 C++,RAII 将更干净地覆盖清理代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

do-while-false 循环常见吗? 的相关文章

随机推荐

  • C 中哪些运算符的优先级错误?

    In the 介绍 K R C 2E 部分有这样一段 C 与任何其他语言一样 也有其缺陷 一些运算符的优先级错误 这些是哪些运营商 他们的优先顺序怎么错了 Is this https www lysator liu se c dmr on
  • Bash 脚本等待(如果已在运行),然后继续

    我有一个 bash 脚本 一旦进程完成 程序就会调用该脚本 我需要一种方法让 bash 脚本在其自身的另一个实例正在运行时等待退出 然后再继续 我不能只使用锁定文件并退出 因为该脚本不会按任何定期计划再次调用 我不能只使用锁定文件并退出 因
  • 使用转置表进行 Alpha-beta 剪枝,迭代深化

    我正在尝试实现通过换位表增强的 alpha beta 最小 最大修剪 我使用这个伪代码作为参考 http people csail mit edu plaat mtdf html abmem http people csail mit ed
  • NSTableView 上的圆角

    我有一个类似于的自定义视图子类NSBox绘制圆形框背景 问题是 如果我放置一个像NSTableView在盒子视图中 它不会夹到圆角 有没有什么方法可以把角变圆NSTableView及其父滚动视图 我还没有尝试过使用表视图 但尝试过使用其他控
  • 无法从 ASP.NET Core 2.0 中的 IdentityUser 和 IdentityRole 继承

    我正在尝试完成对 NET Core 2 0 的更新 但弹出一些错误 问题 我有两个类 ApplicationRole 和 ApplicationUser 它们从 IdentityRole 和 IdentityUser 继承一些属性 更新到
  • 使用Python进行3D绘图

    我正在尝试用 python 绘制曲面 我有一个包含 N N 值的表 我创建了两个向量 X 和 Y 每个向量都有 N 个元素 当我尝试绘制此图时 出现错误 ValueError total size of new array must be
  • 为什么打字稿不能在这里推断类型参数“T”的“T[key of T]”类型?

    我正在尝试编写一个传递密钥的通用类key对应于构造时一组已知接口之一的键 并且稍后可以传递对象thing和类型安全的访问thing key 这就是我所拥有的 interface AB a string b number interface
  • 为什么 CLLocationManager 委托在 iPhone SDK 4.0 中没有被调用?

    这是我的 AppDelegate 类中的代码 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptio
  • 集成 Liferay 和 Alfresco

    我使用 Liferay 版本 5 2 3 和 Alfresco Community Edition 我想将 Alfresco 与 Liferay 集成 我想将 Alfresco 显示为 Liferay 中的一个 portlet 有人可以告诉
  • Visual Studio 升级建议 2008 / 2010 [已关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Java 10 时忽略 Jaxb 包信息

    我正在努力解决这个问题 任何信息将不胜感激 我有一个项目 它已经使用 JAXB 一段时间来从 XML 架构构建 Java 模型并使用该模型 现在它已经在 J ava 8 中运行了一些 但是 我已经升级到 Open JDK 10 当我尝试将
  • Scriptaculous / Prototype 模态窗口

    我想使用原型和 scriptaculous 制作一个模式窗口 我想知道是否有任何网站有教程 或者是否有人可以给我一些想法从哪里开始 我不需要预建的 除了 Control Window 之外 我还发现了其他一些 http okonet ru
  • 使用什么来代替 document.write 或 InnerHTML?

    假设我有这样的 html 代码
  • Inno Setup中的通配符(测试固定字符串前缀后是否有值)

    Inno Setup 是否有一些通配符 我正在尝试遍历字符串 如果我正在搜索某些值 程序应该返回 1 我正在使用Pos 函数已经满足了我的需要 但我的问题是我正在搜索的字符串部分不是静态的 所以我需要一些通配符 例如 可以替换一个或多个字符
  • 有没有办法在 PHPUnit 中测试 STDERR 输出?

    我有一个类输出到STDERR 但我无法找到让 PHPUnit 测试其输出的方法 班上 PHPUnit Extensions OutputTestCase 也没起作用 我没有看到缓冲的方法stderr尽你所能stdout 所以我会重构你的类
  • 如何根据位置在 ruby​​ 中将一些值写入文本文件

    我需要一些帮助 一些独特的解决方案 我有一个文本文件 我必须根据某个位置替换某些值 这不是一个大文件 并且在任何给定时间始终包含 5 行 所有行的长度都是固定的 但我必须专门替换某些位置的某些文本 此外 我还可以在所需的位置放入一些文本 并
  • 使用 marshal_as 和编码进行字符串编组

    之间转换String 使用 marshal as 和 std string 非常容易 但是 我没有找到如何处理此类字符串中的编码的描述 String 使用 UTF 16 但 std string 呢 其中的文本可以以多种方式解释 如果编组可
  • 具有后台工作人员的 Web 应用程序的 Nhibernate 会话管理策略?

    对于 Web 应用程序 处理会话的一个好方法似乎是使用设置
  • C: 无法使用 void* 类型的右值初始化变量

    我有以下代码 int numberArray calloc n sizeof int 我无法理解为什么会收到以下错误 Cannot initialize a variable of type int with an rvalue of ty
  • do-while-false 循环常见吗?

    不久前 我改变了处理 c 风格错误的方式 我发现我的很多代码都是这样的 int errorCode 0 errorCode doSomething if errorCode 0 errorCode doSomethingElse if er