C语言中常用的失败退出和成功返回

server/2024/11/29 18:03:38/

在 C 语言中,封装函数时,我们通常需要判断函数调用是否成功,并据此采取不同的操作。例如,在调用系统函数或库函数时,我们通常会使用一些错误处理机制,如 perror()exit()return 等,来输出错误信息、退出程序或返回不同的状态。

以下是如何参考使用这些错误处理机制(perror()exit()return 0)的示例。

一. 常见的错误处理方法

  • perror():用来输出上一个系统调用或库函数出错时的错误信息。它会输出当前的 errno 值对应的错误描述。

  • exit():用于强制退出程序,并返回一个指定的退出状态码。exit(EXIT_FAILURE) 通常表示程序因错误而退出,exit(EXIT_SUCCESS) 则表示程序正常退出。

  • return 0:通常在函数的返回值为 int 类型时,表示函数执行成功(如果返回值为非零,表示错误)。它通常用于函数返回调用结果时。

  • 错误处理范例

二. 使用 perror() 输出错误信息

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>int create_socket() {int sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd == -1) {perror("socket");  // 输出错误信息exit(EXIT_FAILURE);  // 退出程序,返回失败状态}return sock_fd;
}int main() {int sock = create_socket();printf("Socket created successfully: %d\n", sock);return 0;
}

解释

  • socket() 创建一个套接字,如果失败,perror() 会输出错误信息,并且使用 exit(EXIT_FAILURE) 强制退出程序,表示失败。
  • 如果创建成功,返回套接字描述符。

三.使用 exit() 退出程序

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>void create_socket() {int sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd == -1) {perror("socket");exit(EXIT_FAILURE);  // 强制退出程序,状态码表示失败}printf("Socket created successfully.\n");close(sock_fd);  // 关闭套接字
}int main() {create_socket();  // 调用函数return 0;  // 正常返回
}

解释

  • socket() 失败时,使用 perror() 打印错误信息,之后调用 exit() 退出程序。
  • 如果成功,打印提示信息并关闭套接字。

四.使用 return 0return -1 判断成功或失败

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>int create_socket() {int sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd == -1) {perror("socket");return -1;  // 返回错误标识}return sock_fd;  // 返回成功时的套接字描述符
}int main() {int sock = create_socket();if (sock == -1) {printf("Socket creation failed.\n");return EXIT_FAILURE;  // 返回失败状态}printf("Socket created successfully.\n");close(sock);  // 关闭套接字return 0;  // 返回成功状态
}

解释

  • create_socket() 函数中,如果 socket() 失败,返回 -1,代表错误。
  • 主函数根据返回值判断是否创建成功,如果失败,则输出错误消息并返回 EXIT_FAILURE,表示程序因错误退出。
  • 如果成功,打印成功消息并关闭套接字。

五.判断成功与否的常见模式

在实际开发中,封装函数通常会采取以下几种错误判断方式:

  1. 返回值判断
    • 如果一个函数返回一个状态值(比如返回 0 表示成功,返回非零值表示失败),可以通过 if (func() != 0) 来判断。
  2. 错误处理与退出
    • 如果需要处理错误并终止程序,可以通过 exit(EXIT_FAILURE) 来退出程序。
  3. 输出详细的错误信息
    • 使用 perror() 可以帮助打印详细的错误信息,帮助开发人员诊断问题。

总结

  • perror():打印详细的系统错误信息,通常用于 errno 设置后的错误输出。
  • exit():用于程序出现错误时退出,并返回特定的退出码,表示程序运行失败。
  • return 0return -1:在函数中返回一个值,用于指示函数执行是否成功。return 0 通常表示成功,return -1 或其他值表示失败。

这些错误处理机制可以帮助你在开发中处理异常,增强代码的健壮性和可维护性。

六.exit() 的用法

void exit(int status);
  • status:程序的退出状态码。通常:
    • exit(0):表示程序正常结束(成功退出)。
    • exit(EXIT_SUCCESS):这是一个宏,通常也表示程序成功结束,效果等同于 exit(0)
    • exit(EXIT_FAILURE):这是一个宏,表示程序失败退出,通常用于指示错误发生。

返回成功状态

  • 在程序执行完毕且没有发生任何错误时,使用 exit(0)exit(EXIT_SUCCESS) 来表示程序成功退出。
    #include <stdio.h>
    #include <stdlib.h>int main() {// 执行一些操作printf("Program is running successfully...\n");// 程序正常结束,返回成功状态exit(EXIT_SUCCESS);  // 或者 exit(0);// 这里的代码不会执行到,因为程序已经通过 exit() 退出return 0;
    }
    

    成功退出的状态码常见用法

  • exit(0):表示程序正常结束,没有发生错误。一般而言,返回 0 表示成功,符合 UNIX 和 C 标准的惯例。

  • exit(EXIT_SUCCESS):与 exit(0) 等价,表示程序正常结束,退出状态为成功。

    总结

  • 使用 exit(0)exit(EXIT_SUCCESS) 来表示程序的成功结束。
  • exit() 会立刻终止程序的执行,不会再执行之后的代码,因此它通常用于在程序运行到某个阶段后退出,返回相应的状态码。

http://www.ppmy.cn/server/145954.html

相关文章

102.【C语言】数据结构之用堆对数组排序

0.前置知识 向上调整: 向下调整: 1.对一个无序的数组排升序和降序 排升序问题 建大根堆还是小根堆? 错误想法 由小根堆的定义:树中所有的父节点的值都小于或等于孩子节点的值,这样排出来的数组时升序的,建小根堆调用向上调整函数即可(把画圈的地方改成<即可) arr未…

字符函数和字符串函数

字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件&#xff1a;ctype.h 这些函数的用法非常类似。 int islower ( int c )islower是能够判断参数部分是否是小写字母的。 通过返…

虚幻引擎---目录结构篇

一、引擎目录 成功安装引擎后&#xff0c;在安装路径下的Epic Games目录中可以找到与引擎版本对应的文件夹&#xff0c;其中的内容如下&#xff1a; Engine&#xff1a;包含构成引擎的所有源代码、内容等。 Binaries&#xff1a;包含可执行文件或编译期间创建的其他文件。Bui…

torch.is_nonzero(input)

torch.is_nonzero(input) input: 输入张量 若输入是 不等于零的单元素张量 则返回True&#xff0c;否则返回False 不等于零的单元素张量&#xff1a;torch.tensor([0.]) 或 torch.tensor([0]) 或 torch.tensor([False])单元素张量: 只有一个数 的张量 import torch print(t…

【插入排序】:直接插入排序、二分插入排序、shell排序

【插入排序】&#xff1a;直接插入排序、二分插入排序、shell排序 1. 直接插入排序1.1 详细过程1.2 代码实现 2. 二分插入排序2.1 详细过程2.2 代码实现 3. shell排序3.1 详细过程3.2 代码实现 1. 直接插入排序 1.1 详细过程 1.2 代码实现 public static void swap(int[]arr,…

Vue源码巧妙设计

Vue.js的源码中蕴含了许多巧妙的设计&#xff0c;这些设计使得Vue成为一个高效、灵活且易于使用的前端框架。以下是对Vue源码中一些巧妙设计的详细讲解&#xff1a; 1. 响应式系统 Vue的响应式系统是其核心特性之一&#xff0c;它允许Vue追踪数据的变化&#xff0c;并在数据变…

MySql之MVVC总结

多版本并发控制MVVC&#xff0c;Multi-Version Concurrency Control,通过数据行的多个版本来控制数据库的并发。mysql只有InnoDB引擎才支持MVVC. 通过管理每条记录的多个版本&#xff0c;实现数据库事务并发时一致性读&#xff0c;当前事务A读取正在被其他事务B更新的数据行时…

使用 Canal 实时从 MySql 向其它库同步数据

目前绝大多数项目还是采用 mysql 作为数据存储&#xff0c;对于用户访问量较高的网站来说&#xff0c;mysql 读写性能有限&#xff0c;我们通常会把 mysql 中的数据实时同步到 Redis、mongodb、elastic search 等中间件中&#xff0c;应对高并发访问场景&#xff0c;减轻 mysql…