【发布时间】:2011-02-16 21:55:42
【问题描述】:
重新开始一些 C 工作。
我的许多函数如下所示:
int err = do_something(arg1, arg2, arg3, &result);
根据意图,函数会填充结果,返回值是调用的状态。
黑暗面是你得到了这样的天真:
int err = func1(...);
if (!err) {
err = func2(...);
if (!err) {
err = func3(...);
}
}
return err;
我想我可以宏化它:
#define ERR(x) if (!err) { err = (x) }
int err = 0;
ERR(func1(...));
ERR(func2(...));
ERR(func3(...));
return err;
但这只有在我链接函数调用而不是做其他工作时才有效。
很明显,Java、C#、C++ 有例外,它们非常适合这类事情。
我只是好奇现在其他人在做什么以及其他人如何在他们的 C 程序中进行错误处理。
【问题讨论】:
-
您可以通过检查
err是否为非零并清理/返回来避免这种嵌套。我觉得这样会更好看。 -
我给出了用于不同问题的解决方案:stackoverflow.com/questions/1073397/…
-
@Makis - 如果您只关心错误的存在而不是实际的结果代码,该技术就可以正常工作。在我的案例中,我会对结果代码感兴趣。不过谢谢!
-
有一种“风格”使用 C++,就好像它是“C with exceptions”一样。我以前见过。我遇到的麻烦不在于错误检查的线性级联,而是我的错误检查在几个函数层内。对于“确保你现在离开这里”这件事,异常处理是无可匹敌的。
-
@Warren P:因为这样的问题,我考虑过 C++,但我会等待。作为推论,我在 C 中看到了使用 longjmp 的异常机制(我实际上已经使用过它们,但那是几年前的事了)。
标签: c error-handling