回到一些C工作.
我的许多功能看起来像这样:
int err = do_something(arg1, arg2, arg3, &result);
Run Code Online (Sandbox Code Playgroud)
意图结果由函数填充,返回值是调用的状态.
黑暗面是你得到这样的天真:
int err = func1(...);
if (!err) {
err = func2(...);
if (!err) {
err = func3(...);
}
}
return err;
Run Code Online (Sandbox Code Playgroud)
我想我可以宏观:
#define ERR(x) if (!err) { err = (x) }
int err = 0;
ERR(func1(...));
ERR(func2(...));
ERR(func3(...));
return err;
Run Code Online (Sandbox Code Playgroud)
但这只有在我连接函数调用时才有效,而不是做其他工作.
显然,Java,C#,C++有一些例外,可以很好地处理这些事情.
我只是好奇其他人做了什么,以及其他人如何在他们的C程序中进行错误处理.
Jud*_*den 32
如果你有资源需要在最后发布,那么有时老信托goto
可以派上用场!
int
major_func(size_t len)
{
int err;
char *buf;
buf = malloc(len);
if (err = minor_func1(buf))
goto major_func_end;
if (err = minor_func2(buf))
goto major_func_end;
if (err = minor_func3(buf))
goto major_func_end;
major_func_end:
free(buf);
return err;
}
Run Code Online (Sandbox Code Playgroud)
egr*_*nin 16
两种典型模式:
int major_func()
{
int err = 0;
if (err = minor_func1()) return err;
if (err = minor_func2()) return err;
if (err = minor_func3()) return err;
return 0;
}
int other_idea()
{
int err = minor_func1();
if (!err)
err = minor_func2();
if (!err)
err = minor_func3();
return err;
}
void main_func()
{
int err = major_func();
if (err)
{
show_err();
return;
}
happy_happy_joy_joy();
err = other_idea();
if (err)
{
show_err();
return;
}
happy_happy_joy_joy();
}
Run Code Online (Sandbox Code Playgroud)
你在else
发言中做了什么?如果没有,试试这个:
int err = func1(...);
if (err) {
return err;
}
err = func2(...);
if (err) {
return err;
}
err = func3(...);
return err;
Run Code Online (Sandbox Code Playgroud)
这样你就可以使整个功能短路,甚至不会打扰下面的函数调用.
编辑
回过头再读一遍,我意识到你在else
陈述中所做的并不重要.这些代码可以很容易地在if
块之后立即进行.
如果错误代码是布尔值,那么尝试下面的简单代码:
return func1() && func2() && func3()
Run Code Online (Sandbox Code Playgroud)
OpenGL 采取的一种方法是根本不从函数返回错误,而是呈现可以在函数调用后检查的错误状态。这种方法的一个好处是,当您有一个函数实际上想要返回错误代码以外的内容时,您可以以相同的方式处理错误。另一个好处是,如果用户想要调用多个函数并且只有在所有函数都成功时才成功,您可以在 x 次调用后检查错误。
/* call a number of functions which may error.. */
glMatrixMode(GL_MODELVIEW);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
/* ...check for errors */
if ((error = glGetError()) != GL_NO_ERROR) {
if (error == GL_INVALID_VALUE)
printf("error: invalid value creating view");
else if (error == GL_INVALID_OPERATION)
printf("error: invalid operation creating view");
else if (error == GL_OUT_OF_MEMORY)
printf("error: out of memory creating view");
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3796 次 |
最近记录: |