异常处理

  • 概述

    • 概念

      • 异常是指在程序运行时发生的特殊情况,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;
      }
    • 此示例的异常处理结果如图

信号处理

  • 概述

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

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

      描述
      ABRT
      FPE
      ILL
      INT
      SEGV
      TERM
  • 相关函数

    • 产生中断信号

      • 函数原型

        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;
      }

C++语言-07-异常处理和信号处理的更多相关文章

  1. Go语言中异常处理painc()和recover()的用法

    Go语言中异常处理painc()和recover()的用法 1.Painc用法是:用于抛出错误.Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调 ...

  2. python面向对象07/异常处理

    python面向对象07/异常处理 目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 ...

  3. Go语言之异常处理

    在编写Go语言代码的时候,我们应该习惯使用error类型值来表明非正常的状态.作为惯用法,在Go语言标准库代码包中的很多函数和方法也会以返回error类型值来表明错误状态及其详细信息. error是一 ...

  4. C语言07指针高级

    01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_ ...

  5. 第六十三课、C语言的异常处理

    http://www.cnblogs.com/gui-lin/p/6379101.html 一.异常处理 1.异常的概念 (1).程序在运行过程中可能产生异常 (2).异常(Exception)和Bu ...

  6. c#基础语言编程-异常处理

    异常的定义 异常就是程序中的运行时错误,当出现异常时,系统会捕获这个错误并抛出一个异常.若程序没有提供处理该异常的代码,系统会挂起这个程序. 常见异常的类型 System.Exception 最泛化的 ...

  7. obj-c编程07:异常处理

    好了,到了相对轻松的话题,也是所有语言无可避免的话题:异常的处理. 我们知道对于一些常见的语言,"异常"是逃不开避不掉的主题:C中相对原始的signal或依赖系统异常支持(比如wi ...

  8. C语言-07其它相关

    预处理指令 /* 不带参数的宏定义 1.所有的预处理指令都是以#开头 2.预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含 3.预处理指令在代码翻译成0和1之前执行 4 ...

  9. C#语言-07.文件操作

    a. 文件操作:适用于相对简单的数据保存 i. 读写文件的步骤: . 创建文件流 . 创建读写器 . 读写文件 . 关闭读写器 . 关闭文件流 ii. FileStream(文件流),它主要用于读写文 ...

  10. [R]R语言里的异常处理与错误控制

    之前一直只是在写小程序脚本工具,几乎不会对异常和错误进行控制和处理. 随着脚本结构和逻辑更复杂,脚本输出结果的准确性验证困难,同时已发布脚本的维护也变得困难.所以也开始考虑引入异常处理和测试工具的事情 ...

随机推荐

  1. Css定位总结

    CSS position   static 默认值,没有定位.元素框正常生成.块级元素生成一个矩形框,作为文档流(normal flow)的一部分,行内元素则会创建一个或多个行框,置于其父元素中.to ...

  2. HtmlAgilityPack搭配 ScrapySharp或HtmlAgilityPack.CssSelectors

    Html Agility Pack 源码中的类大概有28个左右,其实不算一个很复杂的类库,但它的功能确不弱,为解析DOM已经提供了足够强大的功能支持,可以跟jQuery操作DOM媲 美:)Html A ...

  3. ASP.NET MVC初识

    最近在博客园看到了很多关于MVC的示例,自己打算写下来记录一下,如果有写得不对的地方,望大侠指出! 开始搭建项目 1. 建立Web项目 文件—>新建项目—>选择ASP.NET MVC4 W ...

  4. C#连接Excel示例代码和驱动

    代码如下: string fileExt = Path.GetExtension(excelPath); string conn = ""; if (fileExt == &quo ...

  5. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  6. Hack语言特性之类型化

    Hack最基础的特性就是类型标注.PHP5已经开始支持对象的类型化,PHP7也提供了标量类型化声明.Hack提供了全面的类型标注支持,与其typecher配合使用,还可以实现快速.前置静态类型验证. ...

  7. Java识别操作系统

    /** * Created by xfyou on 2016/11/3. */ public class SysDep { final static String UNIX_NULL_DEV = &q ...

  8. nodejs中全局变量

    1.global 类似于客户端javascript运行环境中的window module1.js: module.exports={}; //耻辱的使用了全局变量 global.varA = &quo ...

  9. asp.net web常用控件FileUpload(文件上传控件)

    FileUpload控件的主要中能:向指定目录上传文件,该控件包括一个文本框和一个浏览按钮. 常用的属性:FileBytes,FileContent.FileName.HasFile.PostedFi ...

  10. jquery.sobox 经典版弹窗控件

    sobox 是一款非常实用的,基于 jQuery 的弹窗控件.功能非常完整,而代码量又非常少(压缩完仅8k不到)的一款弹窗控件,如果你熟悉ext的弹窗控件,那么sobox的使用对你来说应该是愉悦而完全 ...