C++语言-07-异常处理和信号处理

异常处理

  • 概述
    • 概念
      • 异常是指在程序运行时发生的特殊情况,C++ 中提供了一套异常处理机制,标准库 提供了异常处理的基础
    • 作用
      • 异常提供了一种转移程序控制权的方式
    • 与异常处理相关的关键字
      • throw
        • 用于标记可能抛出的异常的操作
        • 当异常条件被触发时,程序会抛出(throw)一个异常,由 catch 捕获相应的异常,程序跳转到 catch 块定义的异常处理代码
      • try
        • 用于监测某个操作是否抛出异常
        • try 块中的代码是可能抛出异常的代码,其后通常跟随一个和多个 catch 块用于在抛出异常的情况下处理异常
      • catch
        • 用于定义处理其前 try 块可能抛出的异常的代码
        • 可以使用多个 catch 块分别处理不同的异常
        • 也可以使用一个 catch 块处理所有的异常
  • 处理流程
    • 异常处理的格式
      • 标记异常

        /** 
         exceptionHandle() 函数为可能抛出异常的函数,需要使用 throw 关键字标记
        */
        void exceptionHandle() {
            // 在 condition 条件下抛出异常
            if (condition) {
                throw exceptionInfo;
            }
        }
      • 捕获异常
        • 分别捕获不同的异常

          try {
              // 可能抛出异常的代码
          } catch(Exception1 e) {
              // 处理 Exception1 类型的异常
          } catch(Exception2 e) {
              // 处理 Exception2 类型的异常
          }
        • 捕获所有的异常

          try {
              // 可能抛出异常的代码
          } catch(...) {
              // 处理 try 抛出的所有异常
          }
  • 示例
    • 标记可能抛出的异常的操作

      /** 除法函数 */
      double division(double dividend, double divisor) {
          if (divisor == 0) {
              // 标记除 0 异常
              throw "Division by zero condition!";
          }
          return dividend / divisor;
      }
    • 捕获并处理异常

      int main(int argc, const char * argv[]) {
          // 定义相关的变量
          double dividend = 250;
          double divisor = 0;
          double divisionResult;
          // 异常处理代码块
          try {
              // 监测可能抛出的异常的操作
              divisionResult = division(dividend, divisor);
              cout << divisionResult << endl;
          } catch (const char *exceptionInfo) {
              // 处理异常
              cerr << exceptionInfo << endl;
          }
          return 0;
      }
    • 此示例的异常处理结果如图

      783575-20160302095357080-1820392812.png

信号处理

  • 概述

      信号是由操作系统传递给进程的中断,会造成程序的提前终止。在 Terminal 中可以使用组合键 ctrl + C 产生中断。需要注意的是,并非所有的中断都可以被捕获。C++中的中断定义在头文件 <csignal>
  • 信号

    • C++的头文件 定义了一下可捕获的中断信号

      信号描述
      SIGABRT程序异常终止,如:调用 abort
      SIGFPE错误的算数运算,如:除以零或导致溢出的操作
      SIGILL监测非法指令
      SIGINT接收到交互注意信号
      SIGSEGV非法内存访问
      SIGTERM发送到程序的终止请求
  • 相关函数

    • 产生中断信号
      • 函数原型

        int raise(int sig);
        // sig 是要发送的信号编码
    • 捕获中断信号
      • 函数原型

        void (*signal(int, void (*func)(int)))(int);
        /**
        sig:为信号的编码
        func:为指向信号处理函数的指针
        */
        
      • 注意
        • 在捕获中断信号前,必须使用 signal 函数注册
  • 示例

    • 使用 raise 函数生成信号,使用 signal 函数捕获信号

      // 中断处理函数
      void signalHandle(int signalNumber) {
          cout << "Interrupt signal(" << signalNumber << ")received." << endl;
          exit(signalNumber);
      }
      // main 函数
      int main(int argc, const char * argv[]) {
          int i = 0;
          // 注册中断信号与中断处理函数
          signal(SIGINT, signalHandle);
          // 产生中断
          while (++i) {
              cout << "Going to sleep..." << endl;
              if (i == 2) {
                  raise(SIGINT);
              }
              sleep(1);
          }
          return 0;
      }

转载于:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/5233777.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值