处理C中错误的样式?

ImJ*_*ish 3 c error-handling coding-style

可能重复:
C代码中的错误处理

大家好.我正在使用C进行一些小项目,我知道如何,因为它没有专门的错误处理结构,我必须用额外的条件块污染我的算法.我的问题是你更喜欢如何处理错误,并说明原因.我在两种方式之间挣扎......如果你有第三种方式,发布它.谢谢.

///////////////////////////////////////////
// method 1

// stuff that can go wrong;

if (test1 == failed)
{
    // print error;
    // exit;
}
else
{
    // more stuff that can go wrong;

    if (test2 == failed)
    {
        // print error;
        // exit;
    }
    else
    {
        // ... and so on...
    }
}

///////////////////////////////////////////
// method 2

// stuff that can go wrong;

if (test1 == failed)
{
    // print error;
    // exit;
}

// more stuff that can go wrong;

if (test2 == failed)
{
    // print error;
    // exit;
}

// ... and so on...
Run Code Online (Sandbox Code Playgroud)

Bar*_*kin 5

有些人不同意我这个,但我使用goto的.在每个函数内部,最后我在结尾处有一个块,看起来像这样

if (0)
{
ERROR:
  // Handle errors, and exit/return after potentially freeing resources
}
Run Code Online (Sandbox Code Playgroud)

然后我使用if (something_bad) goto ERROR;没有elses或其他东西.

许多人不喜欢goto,但这是实现此目的而不是复制代码的方法.如果你真的坚持不使用goto,我会这样做:

#define LOCAL_ASSERT(COND) if (COND) { \
  /* Handle errors, and exit/return after potentially freeing resources */ \
}
Run Code Online (Sandbox Code Playgroud)

在每个函数的开头为它添加一个define,然后在函数#undef LOCAL_ASSERT的末尾添加一个add .这允许在每个功能处进行不同的错误处理,而不会用不同的宏名称污染整个程序.

然后我就LOCAL_ASSERT(cond)到处使用.

编辑:为了让自己更清楚,这是为了多次保存编写错误处理代码.如果您想要小型自定义,则可以轻松设置错误变量字符串(或将其添加为宏参数).我根本不喜欢别的东西.我经常这样做

// method 1
if (error) goto ERROR; // no else

// method 2
LOCAL_ASSERT(cond);
Run Code Online (Sandbox Code Playgroud)

Elses会污染您的代码并需要更多缩进,这有时很烦人.