0
点赞
收藏
分享

微信扫一扫

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-02

mafa1993 2024-11-10 阅读 10

断言和异常

断言

断言的基本使用

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

在这里插入图片描述
这个断言是在程序执行起来才会进行判定,而静态断言是编译期间的断言

静态断言

静态断言的基本使用

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

在这里插入图片描述

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

在这里插入图片描述

异常

异常基本使用

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

在这里插入图片描述

#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异常案例

#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简单案例

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

举报

相关推荐

0 条评论