C++ 异常处理(try catch throw) 学习笔记

学习资料:

C++异常处理(try catch throw)完全攻略

学习笔记:

【1】    对比函数中处理异常的两种方法

方法 适用场景  利
通过返回值或传引用的参数告诉函数调用者出现了异常 函数需要被多个地方分散随机调用 调用处出现异常后,后面的语句仍然可以继续被执行 需要每个调用函数的地方都判断是否正常执行
在函数中使用throw抛出异常,在调用接口处使用ry catch捕获异常 函数只被一个地方集中调用 try块中throw异常语句后的语句不会被执行 多处函数调用都写在一个 try 块中,任何一处调用发生异常都会被匹配的 catch 块捕获并处理,也就不需要每次调用后都判断是否发生了异常

【2】(throw try catch)异常处理机制

       函数 A 在执行过程中发现异常时可以不加处理,而只是“拋出一个异常”给 A 的调用者,假定为函数 B。拋出异常而不加处理会导致函数 A 立即中止,在这种情况下,函数 B 可以选择捕获 A 拋出的异常进行处理,也可以选择置之不理。如果置之不理,这个异常就会被拋给 B 的调用者,以此类推。如果一层层的函数都不处理异常,异常最终会被拋给最外层的 main 函数。main 函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。

【3】C++ 异常处理基本语法

  (1)抛出异常,异常是一个表达式,其值可以是基本类型,也可以是类

throw 表达式;

(2)捕获异常的语法

try {
    语句组;//有可能有throw 异常表达式;语句
}
catch(异常类型) {
    异常处理代码
}
...
catch(异常类型) {
    异常处理代码
}

try...catch语句的执行过程是:

a.执行try块中的语句,如果执行过程中没有throw抛出异常,那么执行完后就跳过所有catch块,执行最后一个catch块后面的语句;

b.如果try块执行的过程中throw抛出了异常,那么抛出异常后立即跳转到第一个匹配异常类型的catch块内执行,再执行最后一个catch块后面的语句(注意!!只会执行第一个匹配的catch块);如果没有任何catch块捕获的异常类型和throw的异常类型相匹配,那么不会执行任何catch块,这个异常就得不到处理,那么程序就会立即终止于throw语句。

(3)可以捕获任何异常的catch块

//注意!!!能够捕获任何异常
//所以应该作为默认的对异常的处理方式,放在所有其他catch块的后面,不要写在其他异常的前面
catch(...) {
    ...
}

(4)异常的再抛出

     a.异常逐级被捕获,且最多只有一次捕获:如果一个函数在执行过程中 try块中抛出的异常在本函数内就被catch块捕获处理, 那么该异常不会抛给这个函数的调用者(或者说上一级函数);如果throw的异常在本函数没有被处理,则它会抛给上一级函数,如果上一级函数也没有处理,则会抛给上上一级函数,如果所有函数都没有处理,则会抛给main函数中的catch块捕获,如果main函数中没有catch块,那么程序会立即中止。

   b.如果需要异常在多级函数间都被捕获和处理,那么需要在catch块中将异常再次抛出:

如下例子:为了同时在testRethrowException和main函数中都处理异常,在testRethrowException接口中catch块中将异常继续抛出,throw;没有指明拋出什么样的异常,就是catch捕获的异常MyException("--myException");

#include 
class MyException
{
  public:
    MyException(std::string strException)
    {
        m_strException = strException;
    }
    std::string getException()
    {
        return m_strException;
    }
private:
    std::string m_strException;
};

void testRethrowException()
{
    try
    {
        std::cout<< "--testRethrowException try block begins."<< std::endl;
        std::cout<< "--testRethrowException try block throwing..."<< std::endl;
        throw MyException("--myException"); 这个try块只执行到这一步
        std::cout<< "--testRethrowException try block throwed."<< std::endl;
    }
    catch(MyException e)
    {
        std::cout<< "--testRethrowException catch block begins." << std::endl;
        std::cout<<"--The type is:"<< e.getException()<< std::endl;
        std::cout<< "--testRethrowException catch block throwing..." << std::endl;
        throw; 这个catch块只执行到这一步
        std::cout<< "--testRethrowException catch block throwed." << std::endl;
    }
    std::cout<< "--testRethrowException ended." <

运行结果:

C++ 异常处理(try catch throw) 学习笔记_第1张图片

(5)函数的异常声明列表

C++ 异常处理(try catch throw) 学习笔记_第2张图片

你可能感兴趣的:(C/C++,学习,笔记,c++)