我们如何处理 C 语言中的异常和错误,例如我们使用的 C++ 和 Javatry {}
和catch{}
?C有什么办法吗?
2 回答
不,你不能,但是有一些使用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;
}
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>
- 该文件来自某些操作系统中可能发生的可能错误的定义