这个问题实际上是前一段时间programming.reddit.com上的interesting discussion引起的。基本上可以归结为以下代码:
int foo(int bar)
{
int return_value = 0;
if (!do_something( bar )) {
goto error_1;
}
if (!init_stuff( bar )) {
goto error_2;
}
if (!prepare_stuff( bar )) {
goto error_3;
}
return_value = do_the_thing( bar );
error_3:
cleanup_3();
error_2:
cleanup_2();
error_1:
cleanup_1();
return return_value;
}
此处使用
goto
似乎是最好的方法,这导致了所有可能性中最干净,最有效的代码,或者至少在我看来是这样。在代码完成中引用史蒂夫·麦康奈尔:这种方法的另一种支持来自this section中的《 Linux设备驱动程序》一书。
你怎么看?这种情况对C中的
goto
有效吗?您是否希望使用其他方法来产生更复杂的代码和/或更低效率的代码,但避免使用goto
? 最佳答案
FWIF,我发现您在问题示例中给出的错误处理惯用法比到目前为止答案中给出的任何替代方法更具可读性和更易于理解。尽管goto
通常是一个坏主意,但以简单统一的方式处理错误时可能很有用。在这种情况下,即使它是goto
,它也以定义良好且或多或少结构化的方式使用。