在NDK中使用c++时,当发生异常时怎么处理的,所以今天在此我就给大家说说C++中的异常处理,让初学C++的小伙伴能够了解C++中的异常
首先C++中的异常处理要比JAVA中的异常处理要自由,想我们在C++中捕获到异常时可以向函数外抛任意类型的异常,而在JAVA中的就不能这样玩了,在JAVA中要么抛指定类型的异常比如 “空指针 异常(NullPointerException)”,要么抛自定义的异常,而在C++就没有这样的限制,所以说在c++中抛异常要比在JAVA中抛异常要自由得多了,在下面我们在代码中体现C++中的异常自由性,同样在C++中我们要捕获异常也是用try{}catch(){}语句,和JAVA一样。
#include <iostream>
using namespace std;
void sun(int a ,int b){
if(b == NULL){
throw "第二个参数不能为空";
}
}
void main(){
try{
sun(10,0);//在c++中0和NULL是一样的
}
catch(char* s){ //这里的捕获的异常类型是你抛出的异常类型,我上面抛出的类型是字符串所以我这里是char
cout<< s<< endl;
}
system("pause");
}
QQ图片20171118172002.png
上图就是程序运行的结果,可以抛出任意类型的异常。
那么未知的类型的异常要怎么捕获呢?其实也很简单,接下来让代码告诉我们,还是刚才的代码,改一下catch()的参数就可以捕获任意类型的异常了,改成:catch(...)在括号中英文状态下三个点即可,不过这样捕获异常有一个不足的地方那就是我们不能知道程序发生的什么样的异常,只是知道代码中发生了异常。
在java中的不能这样玩的,必须要指定异常类型,那么在C++中有没有标准的异常类型呢?是有的。c++中也提供标准异常类型给我们调用。
void show(int index){
if(index >10){
throw out_of_range("超出范围");
}
}
void main(){
try{
show(20) ;
}catch(out_of_range e){
cout << e.what() << endl;
}
system("pause");
}
代码执行后如图:
QQ图片20171118173931.png
说明我们已经捕获到该异常。
c++中提供了十几种标准的异常类型,这里我就不一一列出了,可以到Vsual Studio中看。
c++中能不能玩自定义的异常呢?也是可以的,那么玩自定义的异常套路和java是一样的都是集成Exception这个类只不过在c++中exception是小写的 ,那么下面就来一个定义的异常
class MyException : public exception{
public:
MyException(char* msg) : exception(msg){}
}
void show(int index){
if(index > 10){
throw MyException("MyException异常");
//另外一种抛出异常的写法就是抛出异常指针,但是我个人不推荐抛出异常指针,好果是抛出异常指针忘记释放,就会造成内存泄露
// throw new MyException("MyException异常");//这里是动态内存分配,所以当我们这样写的时候要释放内存
}
}
void main(){
try{
show(20);
}
catch (MyException& e){ //这里最好用引用,这里我们在用这个异常函数时就不会去创建副本,如是想看一下是否有创建副本,可以重写一下异常函数的拷贝函数即可看到
cout << e.what() << endl;
}
system("pause");
}
QQ图片20171118200344.png
上图就是程序运行效果。
好了C++的异常处理就说到这里了,如是发现有错误的地方,可以留言给我,大家共同学习。
网友评论