c 异常处理
时间: 2023-08-29 08:07:34 浏览: 47
在 C 中,异常处理是通过错误码或者信号来实现的。常见的错误码有 errno 和返回值。当函数执行失败时,会返回一个非零值或者特定的错误码,需要在程序中进行判断和处理。
errno 是一个全局变量,用于保存最近一次函数调用的错误码。可以通过 <errno.h> 头文件中的宏来获取具体的错误码和对应的错误信息。例如:
```c
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
FILE *fp = fopen("non_existent_file.txt", "r");
if (fp == NULL) {
printf("Failed to open file: %s\n", strerror(errno));
return 1;
}
// do something with the file
fclose(fp);
return 0;
}
```
上面的代码中,当打开一个不存在的文件时,fopen 函数会返回一个空指针,并设置 errno 为 ENOENT 错误码,表示文件不存在。通过 strerror 函数将该错误码转换为对应的错误信息,并输出到控制台。
除了 errno 外,还有一些函数会返回特定的错误码,例如 malloc 函数在分配内存失败时会返回 NULL,并设置 errno 为 ENOMEM 错误码,表示内存不足。这时候需要根据返回的错误码来进行相应的处理。
另外,C 中还可以通过信号来处理异常。可以使用 signal 函数来注册信号处理函数,当产生某个信号时,会调用该函数进行处理。例如:
```c
#include <stdio.h>
#include <signal.h>
void handle_signal(int sig) {
printf("Received signal %d\n", sig);
}
int main() {
signal(SIGINT, handle_signal); // 注册 SIGINT 信号处理函数
while (1) { // 不断循环,等待信号
// do something
}
return 0;
}
```
上面的代码中,通过 signal 函数注册了一个 SIGINT 信号处理函数,当用户按下 Ctrl+C 时,会产生 SIGINT 信号,并调用该函数进行处理。在信号处理函数中,可以执行一些特定的操作,例如释放资源、保存数据等。