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)
有些人不同意我这个,但我使用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会污染您的代码并需要更多缩进,这有时很烦人.