异常类型和异常变量的生命周期
throw的异常是有类型的,可以使,数字、字符串、类对象。
throw的异常是有类型的,catch严格按照类型进行匹配。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #define _CRT_SECURE_NO_WARNINGS #include<iostream>
using namespace std;
class MyException { public:
MyException(){} MyException(const char * str){ mStr = new char[strlen(str) + 1]; strcpy(mStr,str); } MyException(const MyException & mE) { this -> mStr = new char[strlen(mE.mStr) + 1]; strcpy(this->mStr,mE.mStr); } void what() { cout << mStr << endl; }
~MyException() { if (mStr != NULL) { delete[] mStr; } cout << "对象析构" << endl; } private: char * mStr;
};
void test01() { throw MyException("未知异常"); }
int main(char *argv[], int argc) { try { test01(); } catch (MyException mE) { mE.what(); } return 0; }
|
throw抛出去的如果是普通类型或者引用变量,它的生命周期是在catch结束后释放掉
如果throw抛出去的是一个指针,那么在进入catch前被释放掉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #define _CRT_SECURE_NO_WARNINGS #include<iostream>
using namespace std;
class MyException { public:
MyException(){} MyException(const char * str){ cout << "对象构造" << endl; mStr = new char[strlen(str) + 1]; strcpy(mStr,str); } MyException(const MyException & mE) { this -> mStr = new char[strlen(mE.mStr) + 1]; strcpy(this->mStr,mE.mStr); } void what() { cout << mStr << endl; }
~MyException() { if (mStr != NULL) { delete[] mStr; } cout << "对象析构" << endl;
} private: char * mStr;
};
void test01() { cout << "&(MyException(未知异常))" << endl; throw &(MyException("未知异常")); } void test02() {
cout << "MyException(未知异常)" << endl; throw MyException("未知异常"); }
void test03() {
cout << "MyException(未知异常) 用普通对象来接" << endl; throw MyException("未知异常"); }
int main(char *argv[], int argc) { try { test01();
} catch (MyException * mE) { cout << "未知异常" << endl; }
cout << "=================================" << endl;
try { test02(); } catch (MyException & mE) { cout << "未知异常" << endl;
}
cout << "=================================" << endl;
try { test03(); } catch (MyException mE) { cout << "未知异常" << endl;
} return 0; }
|
