huangdengtao

1.catch语句中抛出异常

eg:

#include <iostream>
#include <string>

using namespace std;

/*
    假设: 当前的函数式第三方库中的函数,因此,我们无法修改源代码
    
    函数名: void func(int i)
    抛出异常的类型: int
                        -1 ==》 参数异常
                        -2 ==》 运行异常
                        -3 ==》 超时异常
*/
void func(int i)
{
    if(i < 0)
    {
        throw -1;
    }
    
    if(i > 100)
    {
        throw -2;
    }
    
    if(i == 11)
    {
        throw -1;
    }
    
    cout << "Run func..." << endl;
}

void Myfunc(int i)
{
    try
    {
        func(i);
    }
    catch(int i)
    {
        switch(i)
        {
            case -1:
                throw "Invalid Parameter";
                break;
            case -2:
                throw "Runtime Exception";
                break;
            case -3:
                throw "Timeout Exception";
                break;
        }
    }
}

int main()
{
    try
    {
        Myfunc(11);
    }
    catch(const char* cs)
    {
        cout << "Exception Info: " << cs << endl;
    }
    
    return 0;
}

2.异常处理中自定义类类型

a.异常的类型可以是自定义的类类型
b.对于类类型异常的匹配依旧是自上而下,严格匹配
c.在定义catch语句块时,如果适用的是类对象推荐使用引用。可以提高效率(没有拷贝)
d.赋值兼容性原则在异常匹配中依然适用(即子类可以被当成父类用,这样也就会使catch本来应该匹配父类的,结果把子类匹配到父类位置)
解决办法:
1).匹配子类异常的catch放在上部
2).匹配父类异常的catch放在下部

eg:

#include <iostream>
#include <string>

using namespace std;

class Base
{
};

class Exception : public Base
{
    int m_id;
    string m_desc;
public:
    Exception(int id, string desc)
    {
        m_id = id;
        m_desc = desc;
    }
    
    int id() const
    {
        return m_id;
    }
    
    string description() const
    {
        return m_desc;
    }
};


/*
    假设: 当前的函数式第三方库中的函数,因此,我们无法修改源代码
    
    函数名: void func(int i)
    抛出异常的类型: int
                        -1 ==》 参数异常
                        -2 ==》 运行异常
                        -3 ==》 超时异常
*/
void func(int i)
{
    if( i < 0 )
    {
        throw -1;
    }
    
    if( i > 100 )
    {
        throw -2;
    }
    
    if( i == 11 )
    {
        throw -3;
    }
    
    cout << "Run func..." << endl;
}

void MyFunc(int i)
{
    try
    {
        func(i);
    }
    catch(int i)
    {
        switch(i)
        {
            case -1:
                throw Exception(-1, "Invalid Parameter");
                break;
            case -2:
                throw Exception(-2, "Runtime Exception");
                break;
            case -3:
                throw Exception(-3, "Timeout Exception");
                break;
        }
    }
}

int main(int argc, char *argv[])
{
    try
    {
        MyFunc(11);
    }
    catch(const Exception& e)
    {
        cout << "Exception Info: " << endl;
        cout << "   ID: " << e.id() << endl;
        cout << "   Description: " << e.description() << endl;
    }
    catch(const Base& e)
    {
        cout << "catch(const Base& e)" << endl;
    }
    
    return 0;
}

3.c++标准库中异常类族

标准库中的异常都是从exception类中派生的
exception类有两个主要分支:

logic_error

 常用于程序中的可避免逻辑错误

runtime_error

 常用于程序中无法避免的恶性错误

分类:

技术点:

相关文章: