常用的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),即不会抛出异常。

相关推荐
艾莉丝努力练剑5 分钟前
静态地址重定位与动态地址重定位:Linux操作系统的视角
java·linux·运维·服务器·c语言·开发语言·c++
跟着珅聪学java36 分钟前
Electron + Vue 现代化“新品展示“和“快捷下单“菜单
开发语言·前端·javascript
泡沫_cqy36 分钟前
Java初学者文档
java·开发语言
前进的李工1 小时前
数据库视图:数据安全与权限管理利器
开发语言·数据库·mysql·navicat
C_心欲无痕1 小时前
使用 XLSX.js 导出 Excel 文件
开发语言·javascript·excel
王老师青少年编程1 小时前
2025年3月GESP真题及题解(C++七级): 选择题和判断题(题解)
c++·真题·gesp·答案·csp·信奥赛·七级
sycmancia1 小时前
C++——多态
开发语言·c++
t198751281 小时前
基于多尺度特征融合与自适应权重优化的水下图像对比度与边缘增强MATLAB方法
开发语言·matlab
像污秽一样2 小时前
算法设计与分析-算法效率分析基础-习题1.1
c语言·数据结构·c++·算法
chilavert3182 小时前
程序员面试经典问题解答:java篇-2
开发语言·python