学学习网 手机版

学学习网

学习路径: 学习首页 > 应用开发 > c++ >

第七节 模板(Templates)(6)

设置字体:
----------------------------------

throw 语法与 return 相似,只是参数不需要扩在括号。
catch 语句块必须紧跟着try 语句块后面,中间不能有其它的代码。catch 捕获的参数可以是任何有效的数据类型。catch 甚至可以被重载以便能够接受不同类型的参数。在这种情况下被执行catch 语句块是相应的符合被throw扔出的参数类型的那一个:
    // exceptions: multiple catch blocks
    #include <iostream.h>
   
    int main () {
        try {
            char * mystring;
            mystring = new char [10];
            if (mystring == NULL) throw "Allocation failure";
            for (int n=0; n<=100; n++) {
                if (n>9) throw n;
                mystring[n]='z';
            }
        } catch (int i) {
            cout << "Exception: ";
            cout << "index " << i << " is out of range" << endl;
        } catch (char * str) {
            cout << "Exception: " << str << endl;
        }
        return 0;
    }   
                      
Exception: index 10 is out of range
在上面的例子中,有两种不同的例外可能发生:
  1. 如果要求的10个字符空间不能够被赋值(这种情况很少,但是有可能发生):这种情况下扔出的例外会被catch (char * str)捕获。
  2. n超过了mystring的最大索引值(index):这种情况下扔出的例外将被catch (int i)捕获,因为它的参数是一个整型值。
我们还可以定义一个catch 语句块来捕获所有的例外,不论扔出的是什么类型的参数。这种情况我们需要在catch 或面的括号中写三个点来代替原来的参数类型和名称,如:
   try {
       // code here
   }
   catch (...) {
       cout << "Exception occurred";
   }
try-catch 也是可以被嵌套使用的。在这种情况下,我们可以使用表达式throw;(不带参数)将里面的catch 语句块捕获的例外传递到外面一层,例如:
   try {
       try {
           // code here
       }
       catch (int n) {
           throw;
       }
   }
   catch (...) {
       cout << "Exception occurred";
   }
 
没有捕获的例外 (Exceptions not caught)
如果由于没有对应的类型,一个例外没有被任何catch 语句捕获,特殊函数terminate 将被调用。
这个函数通常已被定义了,以便立即结束当前的进程(process),并显示一个“非正常结束”( "Abnormal termination")的出错信息。它的格式是:
void terminate();
标准例外 (Standard exceptions)
一些C++ 标准语言库中的函数也会扔出一些列外,我们可以用try 语句来捕获它们。这些例外扔出的参数都是std::exception 引申出的子类类型的。这个类(std::exception) 被定义在C++ 标准头文件 中,用来作为exceptions标准结构的模型:

因为这是一个类结构,如果你包括了一个catch 语句块使用地址(reference)来捕获这个结构中的任意一种列外 (也就是说在类型后面加地址符 &),你同时可以捕获所有引申类的例外 (C++的继承原则)。
----------------------------------
课程列表
重点难点
赞助链接