断言和异常
断言
断言的基本使用
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),即不会抛出异常。