15.异常处理

15.异常处理,第1张

目录
  • 1.为什么需要异常处理?
  • 2.在c++ 中异常处理的方法??
  • 3.异常的抛出
  • 4.异常的类型捕捉
  • 5.系统预定义的异常类型
  • 6.异常的再抛出

1.为什么需要异常处理?
  1. 用 new 运算符动态分配空间时,空间不够导致无法分配;
  2. 访问数组元素时,下标越界;打开文件读取时,文件不存在。


  3. 访问了野指,出现内存错误等等 …

2.在c++ 中异常处理的方法??
利用try (测试)   throw(抛出异常) catch(处理异常)
  1. 在c 语言 中异常处理的方法??
    ​ 利用 if 语句判断 *** 作是否正确。


  2. c/c++ 中异常处理的区别:
    ​ c++ 中的处理能力更强,逻辑性更严谨,且系统中某些函数已经预定义了异常的抛出。


    如at,new 等等…

  3. 语法:

    try {
        用户需要执行的代码
    }
    catch(异常类型) {
        异常处理代码
    }
    ...
    catch(异常类型) {
        异常处理代码
    }
    
  4. 例子:

    #include 
    using namespace std;
    
    int main()
    {
        try{
           int *p =  new int[0x0fffffffffffffff];  //系统自动抛出异常
        }
        catch(...)  //接收异常
        {
                cout  << "程序出现异常"  << endl;
        }
    }
    
    
3.异常的抛出

当系统不会自动抛出异常时,用户就要手动抛出异常。


 string a="hello"; 
    try{
     cout << a.at(1000000)  << endl;  //带有自动抛出异常的功能
    }catch(...)
    {
         cout << "代码出现异常" << endl;
    }

    try{

        cout << a[1000000] << endl;  //不具有自动抛出异常
    }catch(...){
        cout << "代码异常2" << endl;
    }

抛出异常语法:

throw  表达式;

例子:

#include 
using namespace std;

int main()
{
    string a="hello"; 
    try{
     cout << a.at(1000000)  << endl;  //带有自动抛出异常的功能
    }catch(...)
    {
         cout << "代码出现异常" << endl;
    }

    try{
        int size=1000000;
        if(size >= 5)  //手动  抛出异常
        {
                throw "数组越界";
        }
        cout << a[size] << endl;  //不具有自动抛出异常
        
    }catch(...){
        cout << "代码异常2" << endl;
    }
}
4.异常的类型捕捉

catch(…) : 可以捕捉任何的异常类型,拿不到异常的抛出数据

#include 
using namespace std;

class base
{
    
};

int main()
{
    base a;

    try{
            //直接抛出异常 
            throw  a;
    }
    catch(int a)  //捕捉  抛出的整形的异常
    {
        cout <<  "int"<<a << endl;
    }
    catch(double a)//捕捉  抛出的浮点型的异常
    {
        cout <<"double"<< a << endl;
    }
    catch(const char *a)//捕捉  抛出的字符串类型异常
    {
        cout << "char *"<<a << endl;
    }
    catch(...)
    {
        cout << "其他异常" << endl;
    }

}
5.系统预定义的异常类型

 catch(exception &e)  //利预定义异常类型可以,告诉用户异常原因
 {
 	cout << "其他异常"  << e.what() << endl;
 }
6.异常的再抛出

当一个函数出现异常的时候,抛出异常并,处理的的话,这个异常会继续往上抛出,直到处理为之!!

#include 

using namespace std;

//test 自己抛出自己处理
void test()
{
    try{
          throw "抛出异常";
    }
    catch(const char *a){   //在这里已经把异常处理掉了 
            cout << "输出异常:"  << a << endl;
    }
}

void test0()  //出现了异常,未处理 
{
    throw "抛出异常";  //只在当前函数中抛出不处理
}

void test1() //把异常抛出到 test1中  ,未处理
{
      cout << "test1" << endl; 
      test0();   
      cout <<  "test endl"  << endl;
}

int main() //继续把异常抛出到 main 中,catch已经处理
{
        try{
           // test(); //执行test 函数 
            test1();
        }
        catch(...){
            cout << "出现异常并未处理" << endl;
        }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/564018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存