首先把可能会发生异常的语句放在try语句内,然后通过catch语句接异常,接异常的时候是严格按照类型匹配的(不像函数参数可以进行隐式类型转换)。而抛异常的时候,通过throw语句抛出异常,然后直接转到接收该类型的异常的catch语句处执行,throw后面的语句不再执行,抛出异常的函数后面的语句不再执行(try语句内),这是异常的跨函数特性。异常在接收后也可以不处理继续抛出,但是必须要有接异常,否则程序会挂。
下面通过一个实例分析:
1. #include <iostream> 2. using namespace std; 3. 4. //可以抛出任何类型异常 5. void TestFunc1(const char* p) 6. { 7. if (p == NULL) 8. { 9. throw 1; 10. } 11. else if (!strcmp(p, "")) 12. { 13. throw 2; 14. } 15. else 16. { 17. cout << "the string is : " << p << endl; 18. } 19. } 20. 21. //只能抛出以下类型异常 int char 22. void TestFunc2(const char* p) throw(int, char) 23. { 24. if (p == NULL) 25. { 26. throw '1'; 27. } 28. 29. cout << "the string is : " << p << endl; 30. } 31. 32. //不抛出任何类型异常 33. void TestFunc3(const char* p) throw() 34. { 35. cout << "the string is : " << p << endl; 36. } 37. 38. int main() 39. { 40. char buf1[] = "hello c++"; 41. char* buf2 = NULL; 42. char buf3[] = ""; 43. 44. try 45. { 46. //TestFunc1(buf2); //这里抛出异常,那么后面都不再执行,这是异常的跨函数特性 47. //TestFunc1(buf3); 48. TestFunc2(buf2); 49. TestFunc3(buf1); 50. } 51. catch (int e) //异常严格按照类型进行匹配 52. { 53. switch(e) 54. { 55. case 1: 56. cout << "the string is NULL" << endl; 57. break; 58. case 2: 59. cout << "the string is space" << endl; 60. break; 61. default: 62. cout << "do not know" << endl; 63. break; 64. } 65. } 66. catch (char) //可以只写类型 67. { 68. cout << "throw char test" << endl; 69. } 70. catch (...) 71. { 72. cout << "other err" << endl; 73. } 74. 75. system("pause"); 76. return 0; 77. }