9

我们如何处理 C 语言中的异常和错误,例如我们使用的 C++ 和 Javatry {}catch{}?C有什么办法吗?

4

2 回答 2

8

不,你不能,但是有一些使用goto的模式(Goto 并不总是邪恶的)。

取自本网站的示例

int foo(int bar)
{
  int return_value = 0;

  allocate_resources_1();

  if (!do_something(bar))
    goto error_1;

  allocate_resources_2();

  if (!init_stuff(bar))
    goto error_2;

  allocate_resources_3();

  if (!prepare_stuff(bar))
    goto error_3;

  return_value = do_the_thing(bar);

  error_3:
    cleanup_3();
  error_2:
    cleanup_2();
  error_1:
    cleanup_1();
  return return_value;
}
于 2013-10-02T07:44:24.657 回答
7

C有什么办法吗?

不在C 中进行异常处理。

我会说,只是把这个C 语言异常处理作为一种解决方法。

通常,C(与任何旧语言一样)确实通过返回错误代码、可能设置的 errno 和解释 errno ( sys_errlist) 的字符串表来管理这种情况。因此,C 中的典型错误管理需要测试可能返回错误的函数(几乎所有标准 libc 函数)的任何错误,并且如果发生错误,则以某种方式对其进行管理。

setjmp()longjmp()功能

本文将描述在异常 _C_ase 中应该/可以做什么。C 语言缺少异常处理支持和运行时,不存在 C++ 的try..之类的东西catch,不存在异常类定义和层次结构,但是有一些不错的函数,比如 setjmp()longjmp()try catch

#include <setjmp.h>
#include <stdio.h>
int 
foo(int p)
{
  if (p) siglongjmp(env,p); /* return to sigstejmp returning p */
  return 0;
}

static sigjmp_buf env;
int
main() {
  int a,r;
  if (!(r=sigsetjmp(env, 1))) {
    for (a=0; a<10; a++) {
      fprintf(stdout,"%d\n",foo(a));
      fflush(stdout);
    }
  } else {
    fprintf(stdout,"exceptionally returned %d",r);
    fflush(stdout);
  }
}

sigsetjmp 和 siglongjmp 是符合 posix 并兼容 bsd 标准的变体(参见 GNU Libc 文档)

...是的,它看起来像 C++ 中的 try{..}catch(..) ,除了缺少 catch 参数,并且只有一级异常

C中的错误处理:

C 不提供对错误处理(也称为异常处理)的直接支持。按照惯例,程序员应该首先防止错误发生,并测试函数的返回值。

有一个名为“errno”的外部变量,包含后可由程序访问<errno.h>- 该文件来自某些操作系统中可能发生的可能错误的定义

来源参考

于 2013-10-02T07:40:12.953 回答