错误处理
1、通过函数的返回值表示执行错误:
// 返回合法值表示成功 返回非法值表示失败 // 计算大小、查找 long file_size(const char* path) { FILE* fp = fopen(path,"r"); if(NULL == fp) return -1; // 返回非法值 fseek(fp,SEEK_END,0); long size = ftell(fp); fclose(fp); return size; } // 返回指针类型 返回NULL/0xffffffff表示失败,malloc、mmap Node* query_list(Node* head,TYPE data) { for(Node* n=head->next; n; n=n->next) { if(n->data == data) return n; } return NULL; } // 返回0表示成功,非零表示失败 main、fseek // 永远成功的函数,printf、menu菜单函数
2、通过errno全局变量表示错误:
-
errno是一个记录系统最后一次错误代码原因的全局变量,是int类型的值,需要导入头文件 <errno.h> 通过该全局变量的值查看和调试程序错误。
-
当调用Linux系统API函数发生异常,一般系统会自动地将本程序的errno修改一个值,不同的值表示不同的异常,可以通过该值获取和推测出程序出现了什么问题,实际编程中能找出大部分调用系统API出现的异常
-
一般errno在程序执行成功时不会被修改,但是毕竟是一个全局变量,可能被其他人或者操作失误而修改,因此不能以errno非零就断定程序出现了异常,只能先根据其他具体条件判断出程序出现异常后,才能使用errno来确定异常的原因
#include <stdio.h> #include <string.h> #include <errno.h> int main(int argc,const char* argv[]) { FILE* fp = fopen("xixi","r"); if(NULL == fp) { printf("fopen:%d\n",errno); printf("fopen:%s\n",strerror(errno)); printf("fopen:%m\n"); perror("fopen"); } fclose(fp); }