我想知道在编程中处理错误的最好方法是什么(我用C编写代码)。我是编程新手,这就是我要做的:
if( action1 was successfull )
{
[some code]
if (action 2 was successfull)
{
[some more code ..]
if (action 3 was successfull)
{
ETC ...
}
else
{
[Handle error3]
}
}
else
{
[handle error2]
}
}
else
{
[Handle error1]
}但我觉得这是个坏习惯。有人能给我解释一下最优雅的方式是什么吗?谢谢
发布于 2012-02-07 01:55:48
我是这样做的:
// more code
if (!action_1_succeeded())
{
handle_error();
return;
}
// more code
if (!action_2_succeeded())
{
handle_error();
return;
}
// more code
if (!action_3_succeeded())
{
handle_error();
return;
}通常,我会将handle_error和return包装到一个宏中,所以我只执行check_error(some_statement());
发布于 2012-02-07 02:02:52
有时,您显示的代码确实是最好的可用选项,但这里有一些替代方案。
通常情况下,您可以像这样构建代码:
if (action_1() failed) {
report error;
return -1;
}
if (action_2() failed) {
report error;
return -1;
}
/* etc */这种结构就是为什么在成功时返回0或在失败时返回-1成为常见的C惯用法的原因:它允许您仅将if (action_1() failed)编写为if (action_1())。
如果您需要在返回之前做一些清理,并且清理操作嵌套整齐,这是另一种可能性:
if (action_1()) {
report error;
goto fail_a1;
}
if (action_2()) {
report error;
goto fail_a2;
}
if (action_3()) {
report error;
goto fail_a3;
}
/* etc */
return 0;
/* errors */
/* etc */
fail_a3:
clean up from a2;
fail_a2:
clean up from a1;
fail_a1:
return -1;为了实现这一点,您已获得使用goto的许可。
发布于 2012-02-07 02:04:08
您可以创建error-ids并将错误处理程序与特定类型的错误相关联。
typedef struct _error {
void (*handler)(struct _error *);
int i_params;
char *c_params;
} error;
void nope(error * e) {}
void file_err(error * e) { exit(1); }
error handlers[200];
void check_error(int id) {
handlers[id].handler(&handlers[id]);
}
enum error { ER_SUCCESS, ER_FILE};
int main() {
handlers[ER_SUCCESS].handler = nope;
handlers[ER_FILE].handler = file_err;
check_error(action1());
return 0;
}https://stackoverflow.com/questions/9164642
复制相似问题