码迷,mamicode.com
首页 > 编程语言 > 详细

C++异常处理

时间:2018-04-16 16:11:06      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:类型转换   code   内存   模块   思想   转换   数组   导致   间接   

一 C++异常处理机制

  异常处理基本思想:执行一个函数的过程中发现异常,可以不用再本函数内立即进行处理,而是抛出该异常,让函数的调用者直接或间接的处理这个问题。

  C++异常处理进制由三个模块组成:try、throw、catch

  try---catch基本语法:

try 
 { 
可能抛出异常的语句;(检查) 
} 
catch(类型名[形参名])//捕获特定类型的异常 
{ 
 //处理1; 
} 
catch(类型名[形参名])//捕获特定类型的异常 
{ 
 //处理2; 
} 
catch(…)//捕获所有类型的异常 
{ 
 } 

 

   示例:

void f1(int i)
{
    if (i<0)
        throw 1;
}
void f2()
{
    f1(-45);
}
void f3()
{
    f2();
}
void f4()
{
    f3();
}
int main()
{
    try{
        f4();
    }
    catch (int i)
    {
        cout <<"error code:"<< i <<"\n"<< endl;
    }
    system("pause");
    return 0;
}

二 异常捕获的匹配规则

  try块里面抛出哪种异常,则catch里面捕获哪种类型的异常,一般情况下,类型必须完全匹配,但以下三种情况可以进行类型转换:

  (1)运行从非const对象到const对象转换,即throw一个非const对象,catch一个const对象

  (2)运行从派生类类型到基类型的转换

  (3)将数组转换为数组类型的指针,函数转换为指向函数类型的指针

void fun(int i)
{
    if (i < 0)
        throw - 1;
}
void fun2()
{
    try
    {
        fun(-23);
    }
    catch (int i)
    {
        switch (i)
        {
        case -1;
            throw "数据越界";//重新抛出
        }
} } int main() { try
    {
        fun2(-34);
    }
    catch (const char *s)
    {
        cout << "error code:" << s<<"\n" << endl;
    }
    system("pause");
    return 0;
}

三 异常规范

  (1)函数声明之后,列出函数可能抛出的异常类型,并保证该函数不会抛出其他类型的异常

    a. void fun() throw(toobig,toosmall,divzero); // 函数抛出指定异常

    b. void f();  // 这意味函数会抛出任何一种异常

    c. void f() throw();   // 这意味函数不会抛出异常

  (2) 保证不在构造函数中抛出异常,因为构造函数的作用是构造对象并初始化,一旦抛出异常,有可能导致对象不完整或没有完全初始化

  (3)保证不在析构函数中抛出异常,因为析构函数的作用是完成资源的清理,一旦抛出异常,有可能导致内存泄露等等

C++异常处理

标签:类型转换   code   内存   模块   思想   转换   数组   导致   间接   

原文地址:https://www.cnblogs.com/xiaobingqianrui/p/8855836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!