首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理错误

如何处理错误
EN

Stack Overflow用户
提问于 2012-02-07 01:49:09
回答 3查看 204关注 0票数 0

我想知道在编程中处理错误的最好方法是什么(我用C编写代码)。我是编程新手,这就是我要做的:

代码语言:javascript
复制
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]
}

但我觉得这是个坏习惯。有人能给我解释一下最优雅的方式是什么吗?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-07 01:55:48

我是这样做的:

代码语言:javascript
复制
// 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_errorreturn包装到一个宏中,所以我只执行check_error(some_statement());

票数 4
EN

Stack Overflow用户

发布于 2012-02-07 02:02:52

有时,您显示的代码确实是最好的可用选项,但这里有一些替代方案。

通常情况下,您可以像这样构建代码:

代码语言:javascript
复制
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())

如果您需要在返回之前做一些清理,并且清理操作嵌套整齐,这是另一种可能性:

代码语言:javascript
复制
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的许可。

票数 4
EN

Stack Overflow用户

发布于 2012-02-07 02:04:08

您可以创建error-ids并将错误处理程序与特定类型的错误相关联。

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9164642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档