常用的c++新特性-->day03

断言和异常

断言

断言的基本使用

cpp 复制代码
#include <iostream>
#include <cassert>// >>>>>>>>>>>>>>>> 断言的头文件
using namespace std;

char* createArray(int size)
{
    // 通过断言判断数组大小是否大于0
    assert(size > 0);	// 必须大于0, 否则程序中断
    char* array = new char[size];
    return array;
}

int main()
{
    char* buf = createArray(0);
    delete []buf;
    return 0;
}

这个断言是在程序执行起来才会进行判定,而静态断言是编译期间的断言

静态断言

静态断言(static_assert),静态就是在编译时 就能够进行检查的断言,使用时不需要引用头文件。静态断言的另一个好处是,可以自定义违反断言时的错误提示信息 。静态断言使用起来非常简单,它接收两个参数:

参数1:断言表达式,这个表达式通常需要返回一个 bool值

参数2:警告信息,它通常就是一段字符串,在违反断言(表达式为false)时提示该信息

静态断言的基本使用

cpp 复制代码
// assert.cpp
#include <iostream>                                         
using namespace std;
  
int main()
{
    static_assert(sizeof(long) == 4, "错误, 不是32位平台...");
    cout << "64bit Linux 指针大小: " << sizeof(char*) << endl;
    cout << "64bit Linux long 大小: " << sizeof(long) <<endl;
  
    return 0;
}
cpp 复制代码
// assert.cpp
#include <iostream>                                         
using namespace std;
  
int main()
{
    static_assert(sizeof(long) == 8, "错误, 不是32位平台...");
    cout << "64bit Linux 指针大小: " << sizeof(char*) << endl;
    cout << "64bit Linux long 大小: " << sizeof(long) <<endl;
  
    return 0;
}

异常

异常基本使用

cpp 复制代码
#include <iostream>
using namespace std;

double division(int a, int b)
{
    if (b == 0)
    {
        throw "Division by zero condition!";
    }
    return (a / b);
}

int main()
{
    int x = 50;
    int y = 0;
    double z = 0;

    try {
        z = division(x, y);
        cout << z << endl;
    }
    catch (const char* msg) {
        cerr << msg << endl;
    }

    return 0;
}
cpp 复制代码
#include <iostream>
using namespace std;

double division(int a, int b)
{
    if (b == 0)
    {
        throw "Division by zero condition!";
    }
    return (a / b);
}

int main()
{
    int x = 50;
    int y = 1;
    double z = 0;

    try {
        z = division(x, y);
        cout << z << endl;
    }
    catch (const char* msg) {
        cerr << msg << endl;
    }

    return 0;
}

c++98异常案例

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
struct MyException
{
    MyException(string s) :msg(s) {}
    string msg;
};

double divisionMethod(int a, int b) throw(MyException, int)// >>>>>>>>> 指定只能抛出这两种类型异常MyException 或者是 int
{// >>>>>>>> 如果throw() >>>>>>>> 指的是当前函数不允许抛出异常
    //不写就指任意类型
    if (b == 0)
    {
        throw MyException("division by zero!!!");
        // throw 100;
    }
    return a / b;
}

int main()
{
    try
    {
        double v = divisionMethod(100, 0);
        cout << "value: " << v << endl;
    }
    catch (int e)
    {
        cout << "catch except: " << e << endl;
    }
    catch (MyException e)
    {
        cout << "catch except: " << e.msg << endl;
    }
    return 0;
}

noexcept

c++11引入了noexcept

noexcept简单案例

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
struct MyException
{
    MyException(string s) :msg(s) {}
    string msg;
};
//不加的话就是抛出异常 加了就是不抛出异常
double divisionMethod(int a, int b) noexcept//>>>>>>>>>>>不抛出异常
{
    if (b == 0)
    {
        throw MyException("division by zero!!!");
        // throw 100;
    }
    return a / b;
}

int main()
{
    try
    {
        double v = divisionMethod(100, 0);
        cout << "value: " << v << endl;
    }
    catch (int e)
    {
        cout << "catch except: " << e << endl;
    }
    catch (MyException e)
    {
        cout << "catch except: " << e.msg << endl;
    }
    return 0;
}

double divisionMethod(int a, int b) noexcept(常量表达式);

常量表达式的结果会被转换成一个bool类型的值:

值为 true,表示函数不会抛出异常

值为 false,表示有可能抛出异常这里

不带常量表达式的noexcept相当于声明了noexcept(true),即不会抛出异常。

相关推荐
Tairitsu_H几秒前
[LC优选算法#3] 滑动窗口 | 将x减到0的最⼩操作数 | ⽔果成篮 | 字⺟异位词
c++·算法·leetcode·滑动窗口
_Evan_Yao2 分钟前
面向对象实战:用 Java/Python 设计一个简单的“怪物战斗”小游戏
java·开发语言
c++之路5 分钟前
CMake 系列教程(一):CMake 基础知识
c语言·开发语言·c++
AI行业学习5 分钟前
CC‑Switch v3.16.1-下载、配置、安装(2026‑06‑01 最新官方版)
开发语言·人工智能·windows·python
赵庆明老师7 分钟前
JS检查提交的文件是否合规
开发语言·前端·javascript
Irissgwe9 分钟前
C++ STL bitset 和位图详解
开发语言·c++·stl·位图·bitset
我还记得那天10 分钟前
C语言随机数生成机制与猜数字游戏实现
c语言·开发语言·游戏
伊灵eLing40 分钟前
GoLang 语言基础
开发语言·后端·golang
两年半的个人练习生^_^41 分钟前
JMM 进阶:彻底理解 synchronized 实现原理
java·开发语言
小白不白11143 分钟前
Invoke的用法
开发语言·人工智能·数码相机·计算机视觉·c#