常用的c++新特性-->day03
断言和异常
- 断言
- 断言的基本使用
- 静态断言
- 静态断言的基本使用
- 异常
- 异常基本使用
- c++98异常案例
- noexcept
- noexcept简单案例
断言
断言的基本使用
#include <iostream>
#include <cassert>// >>>>>>>>>>>>>>>> 断言的头文件
using namespace std;char* createArray(int size)
{// 通过断言判断数组大小是否大于0assert(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)时提示该信息
静态断言的基本使用
// 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;
}
double divisionMethod(int a, int b) noexcept(常量表达式);
常量表达式的结果会被转换成一个bool类型的值:
值为 true,表示函数不会抛出异常
值为 false,表示有可能抛出异常这里
不带常量表达式的noexcept相当于声明了noexcept(true),即不会抛出异常。