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

 更新时间:2024年12月15日 09:54:08   作者:程序加冰  
在 C 语言中,封装函数时,我们通常需要判断函数调用是否成功,并据此采取不同的操作,例如,在调用系统函数或库函数时,我们通常会使用一些错误处理机制,来输出错误信息、退出程序或返回不同的状态,以下是如何参考使用这些错误处理机制的示例,需要的朋友可以参考下

一. 常见的错误处理方法

  • 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 0 或 return -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 0 或 return -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() 会立刻终止程序的执行,不会再执行之后的代码,因此它通常用于在程序运行到某个阶段后退出,返回相应的状态码。

以上就是详解C语言中常用的失败退出和成功返回的详细内容,更多关于C语言失败退出和成功返回的资料请关注脚本之家其它相关文章!

相关文章

  • DSP中浮点转定点运算--浮点与定点概述

    DSP中浮点转定点运算--浮点与定点概述

    本文主要介绍DSP中浮点与定点概述,很值得学习一下,需要的朋友可以参考一下。
    2016-06-06
  • C语言全局变量和局部变量的示例代码

    C语言全局变量和局部变量的示例代码

    本文主要介绍了C语言全局变量和局部变量的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 详细分析C++ 信号处理

    详细分析C++ 信号处理

    这篇文章主要介绍了C++ 信号处理的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 一篇文章教你如何用C语言实现strcpy和strlen

    一篇文章教你如何用C语言实现strcpy和strlen

    这篇文章主要为大家介绍了C语言实现strcpy和strlen的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 浅谈C语言弱定义机制

    浅谈C语言弱定义机制

    本文详细介绍了C语言弱定义机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • C语言之把数组名作函数参数的四种情况说明

    C语言之把数组名作函数参数的四种情况说明

    这篇文章主要介绍了C语言之把数组名作函数参数的四种情况说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++map,set,multiset,multimap详细解析

    C++map,set,multiset,multimap详细解析

    在C++标准模板库(STL)中,容器分为关联式容器和序列式容器两大类,关联式容器主要包括set、map、multiset和multimap,通过索引来访问元素,本文给大家介绍C++ map,set,multiset,multimap的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • C++中构造函数与析构函数的详解及其作用介绍

    C++中构造函数与析构函数的详解及其作用介绍

    这篇文章主要介绍了C++中构造函数与析构函数的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • VScode + keil开发环境搭建安装使用过程

    VScode + keil开发环境搭建安装使用过程

    这篇文章主要介绍了VScode + keil开发环境搭建及安装使用过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • C++ 风靡一时的连连看游戏的实现流程详解

    C++ 风靡一时的连连看游戏的实现流程详解

    游戏“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的“连连看”。这其中,顾芳编写的“阿达连连看”以其精良的制作广受好评,这也成为顾方“阿达系列软件”的核心产品。并于2004年,取得国家版权局的计算机软件登记证书
    2021-11-11

最新评论