异常,什么叫异常,如何处理?

一、异常

1.什么叫异常

        遇到错误一般是exit或者return,但大型程序不允许关闭或退出,所以就需要一套很好的容错机制

        容错包含:异常处理,标准错误码,错误日志log

2.异常的处理流程:

try(检查)->throw(抛出异常)catch->(捕获异常)

try:尝试检查代码块中是否有特定异常,如果有则丢给catch处理

throw: 当发现异常的时候,手动抛出一个异常

catch:捕获异常,也是当try发现异常后,catch处理

总结:当try遇到捕获到异常后try后的代码不会继续执行,直接跳转到catch中

           当函数中丢异常throw后,则throw后面的不会执行

            catch执行完成后,继续执行catch括号外的代码;

            cathch中用三个点,表示可以捕获所有的异常 catch(...){ }

3.抛出不同类型的异常

格式: throw 类型;

注意:当抛出的类型有const修饰的时候,捕获也需要const修饰,严格类型匹配

4.捕获异常

  catch(类型 变量){}  特定异常:只可以捕获到指定类型的异常

  catch(...){}         所有异常:当catch中是三个点时,表明可以捕获所有异常

  如果没有捕获所有异常,或者没有捕获throw对应的异常类型,则内核处理异常

注意:

    同一种类型只可以一种catch捕获,通过catch的参数区别相同类型的不同异常

    捕获异常的Catch是从第一个开始匹配,catch和throw的类型不同则匹配第二个;

     catch(...)必须放所有catch最后,用来处理没有捕获的异常。一般情况下都会有

5.异常嵌套

在异常的try和catch中继续嵌入一个try和catch()

try
{
    throw 12;
    try
    {
    }
    catch(...)
    {
    }   
}

catch()
{
}

6.函数异常申明

在函数声明时,确定抛出的异常类型,增加代码可读性,增加捕获的确定性。

  格式: 返回值 函数名(参数列表)throw(类型1,类型2){ }

  解析:以上代码中,函数中只可以throw类型1和类型2,不允许丢其他类型

       注意:

        如果函数异常申明的时候是throw(int)则函数中只可以丢int类型的异常

       如果函数异常申明的时候是throw(int)丢double异常,则捕获不到。内核处理

       如果函数异常申明的时候是throw(),表明此函数不可以丢异常。不可以有throw  

7.丢对象类型异常:

前奏:在丢异常过程中,可以直接对对象类型。Catch也可以捕获对象类型

int fun() throw(int,student)//student为student类
{
    struct student stu;
    if(stu.id<0)
    {
        throw stu.id;
    }
    if(stu.id>0)
    {
        throw stu;
    }
}

int main()
{
    try
    {
        fun();
    }
    catch(int error){}
    catch(student error){}
    catch(...){}
    return 0;
}

8.标准异常派生类:(自定义的异常类)

     定义:写一个类,继承exception类

     格式:class student: public excepion{}

猜你喜欢

转载自blog.csdn.net/m0_74889801/article/details/128839830