1、调试函数assert()
2、捕获异常
用于对付潜在的编程错误
使用思路
1、安排一些C++代码(try语句)去尝试某件事–尤其是那些可能失败的事(比如打开一个文件或申请一些内存)
2、如果发生问题,就抛出一个异常(throm语句)
3、再安排一些代码(catch语句)去捕获这个异常并进行相应的处理。
捕获异常的基本代码如下
try
{
//do something
//Throw an exception on error.
}
catch
{
//do whatever
}
注意:每条try语句至少要有一条配对的catch语句,必须定义catch语句以便让它接收一个特定类型的参数。
c++还允许我们定义多条catch语句,让每条catch语句分别对应着一种可能的异常类型:
catch(int e){…}
catch(bool e){…}
catch(…){…}
最后一条catch语句可以捕获任何类型的异常。
在程序中,我们可以throw保留字来抛出一个异常:throw1;
在某个try语句块里执行过throw语句,它后面的所有语句(截止到这个try语句块末尾)将永远不会被执行。
你可以在定义一个函数时,明确地表明你想让它抛出一个异常,为了表明你想让它抛出哪种类型的异常,可以使用以下所示语法:
-type functionName(arguments) throw(type);
如果没有使用这种语法来定义函数,就意味着函数可以抛出任意类型的异常。
注意:有些编译器不支持这种语法,则可省略throw(type)部分。
#include <iostream>
#include <string>
#include<climits>
//首先定义函数,抛出异常
unsigned long returnFactorial(unsigned short num) throw(const char *);
int main()
{
unsigned short num=0;
std::cout<<"请输入一个整数:";
while(!(std::cin>>num)||(num<1))
{
std::cin.clear();
std::cin.sync();
std::cout<<"请重新输入一个整数:";
}
try
{
unsigned long factorial=returnFactorial(num);
std::cout<<num<<"的阶乘是:"<<factorial;//正常的话会由return num返回回来。,异常不读该行
}
catch(const char*error) //接收异常字符串的地址
{
std::cout<<error;
}
return 0;
}
unsigned long returnFactorial(unsigned short num)throw(const char *)
{
unsigned long sum=1;
unsigned long max=ULONG_MAX;
for(int i=1;i<=num;i++)
{
sum*=i;
max/=i;
}
if(max<1)
{
throw"悲催,该基数太大无法求阶乘\n"; //返回字符串的指针
}
else
{
return sum;
}
}
正常情况:
异常处理:
unsigned long 最大值是2^32-1,即0xffffffff 无符号 长整型是int型的二倍。即8位。