避免多个返回语句的方法
Methods to avoid multiple return statements
我为避免多个返回陈述的方法而做出的努力,因此清理资源不会重复,使我找到了以下方式:
-
使用宏,如果错误不正常,请进行清理。
#define EXE(x) if (OK != (err = x)) goto cleanup; ErrorCode func () { ErrorCode err = OK; EXE (fn1()); EXE (fn2()); cleanup: // do cleanup of resources return err; }
-
发生错误时使用do ... while()断开
ErrorCode func () { ErrorCode err = OK; do { err = fn1(); if (err != OK) break; err = fn2(); if (err != OK) break; } while (false); // do cleanup of resources return err; }
允许在一个地方清理资源(紧接在返回语句上方)并提高可读性的方式。还有其他方法可以避免多个返回吗?
您无需求助于goto
即可清洁C 。在自动范围中构建的所有对象都将被破坏。他们必须负责清理。
也就是说,您可以使用宏来简化错误检查代码的编写。
#define CHECK_ERROR(x) if (OK != x) return x;
ErrorCode func ()
{
ErrorCode err = OK;
err = fn1();
CHECK_ERROR(err);
err = fn2();
CHECK_ERROR(err);
return err;
}
更新,响应OP的评论
使用助手类调用CloseHandle
。
struct HandlerMinder
{
HandleMinder(ErrorCode& err, HANDLE hObject) :
err_(err), hObject_(hObject) {}
~HandleMinder()
{
// Adapt the logic to suit your needs.
if ( err_ != OK )
{
CloseHandle(hObject_);
}
}
ErrorCode& err_;
HANDLE hObject_;
};
ErrorCode func ()
{
ErrorCode err = OK;
HANDLE object = <some handle>;
HandleMinder m(err, object);
err = fn1();
CHECK_ERROR(err);
err = fn2();
CHECK_ERROR(err);
return err;
}
相关文章:
- 所有类实例方法的打印语句最后都在打印吗?
- 在c++中的复制构造函数/一个声明语句中的初始化的延续中使用chain方法
- 在 if 语句中处理多个 or 的更优雅的方法是什么
- 有没有更有效的方法来替换这些多个 IF 语句?
- 一种无需使用if语句而无需使用阈值的方法
- 减少 if-elseif 语句的聪明方法
- 是否可以在一个语句中创建对象并调用方法?
- 避免多个返回语句的方法
- C :Bool方法在COUT语句之后返回意外数字
- 用 c++ 编写一堆类似的 if 语句的漂亮方法
- 有没有更简单的方法在 Rcpp 中使用 NumericVector 编写条件语句
- 有什么方法可以在C #include语句中使用通配符
- 最简单的方法来封装几个语句中的几种语句
- 通过找到一种删除许多 if 语句的方法来简化代码
- 哪个工具可以在C++中显示方法或函数的最大语句
- cython return 语句给出了一个内置方法而不是整数
- "Objective C" vs "C++":方法调用语句的差异
- 将字符串存储在要在 IF 语句中使用的数组中的可能方法
- 在 switch 语句中展开模板的替代方法
- 编写 if then else 类型语句的简洁方法