10_MFC异常、CPP异常、虚函数的异常、模板类的异常、内存异常

【目录】

一、 MFC异常: 2
二、 CPP异常: 3
三、 类的异常(面向对象的异常): 4
1、 例子1: 4
2、 例子2: 5
四、 异常类的派生: 7
五、 虚函数的异常: 8
六、 模板类的异常: 10
七、 内存异常 11

一、MFC异常:

// MFC异常.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "MFC异常.h"
#include<iostream>
#include <stdlib.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

void openfile()
{
    //CFile file(_T("C:\\123.txt"), CFile::modeRead);

    TRY
    {
        CFile file(_T("C:\\123.txt"), CFile::modeRead);
        //尝试动作,如果异常,抛出异常
    }
    CATCH(CFileException e)//文件的异常
    {
        if (e->m_cause == CFileException::fileNotFound)
        {
            cout << "文件不存在,请认真检查";
        }
    }
    END_CATCH
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    if (hModule != NULL)
    {
        // 初始化 MFC 并在失败时显示错误
        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        {
            // TODO:  更改错误代码以符合您的需要
            _tprintf(_T("错误:  MFC 初始化失败\n"));
            nRetCode = 1;
        }
        else
        {
            // TODO:  在此处为应用程序的行为编写代码。
            openfile();
            system("pause");

        }
    }
    else
    {
        // TODO:  更改错误代码以符合您的需要
        _tprintf(_T("错误:  GetModuleHandle 失败\n"));
        nRetCode = 1;
    }

    return nRetCode;
}

二、CPP异常:

#include <iostream>
#include <string.h>
using namespace std;

/*标识错误的类型*/
class wrong  
{
};
int intdiv(int a, int b)
{
    try
    {
        if (b==0)
        {
            throw 10;
            //可以是任何对象  wrong();
             abort();/*可以抛出这个异常*/
        }
        int c = a / b;
        return c;
    }
    catch (int data )//类型名,一般是在throw抛出一个对象,这里接收异常对象
    {
        cout << "除法异常已经处理";
        return -1;
    }
}
int intdivA(int a, int b)
{
    return a / b;
}
void main()
{
    int x, y;
    cin >> x >> y;
    try
    {
        if (y==0)
        {
            throw "被除数为0";
        }
        else if (x==0)
        {
            throw "除数为0";
        }
    }
    catch (const char * s)
    {
        if (strcmp(s,"被除数为0")==0)
        {
            cout << "被除数为0异常,请重新输入";
            cin >> x >> y;
        }
        else  if (strcmp(s, "除数为0") == 0)
        {
            cout << "除数为0异常,请重新输入";
            cin >> x >> y;
        }
    }
    std::cout << intdiv(x, y);
    cin.get();
    cin.get();
}

三、类的异常(面向对象的异常):

1、例子1:

#include<iostream>
using namespace std;
class wrong
{       };
class wrongA
{       };
class Array
{
public:
    Array(int num)
    {
        n = num;
        if (num<=0)
        {
            throw  wrong();/*抛出匿名对象*/
        }
        p = new int[num];/*正确代码在throw之后,不会被执行*/
        for (int i = 0; i < num;i++)
        {
            p[i] = 0;
        }
    }
    int & operator[](int num)
    {
        if (num < 0 || num>= n)
        {
            throw wrongA();/*抛出对象*/
        }
        return p[num];
    }
private:
    int *p;
    int n;
};
void main()
{
    try
    {
        Array myarrar(2);
        myarrar[-1];
    }
    catch (wrongA  e)
    {
        cout << "下标越界";
    }
    catch (wrong  e)
    {
        cout << "程序发生异常,数组大小必须大于等于1";
    }
    cin.get();
}
void mainA()
{
    int a[3] = { 1, 2, 3 };
//  printf("%d", 2[a]);//*(2+a)
    getchar();
}

2、例子2:

#include<iostream>
#include <string>
using namespace std;

class box   //正方体
{
public:
    box(int data) 
    {
        cout << "开始构造";
        if (data ==0)
        {
            zero z1;
            z1.errorcode = 212;
            throw z1;/*抛出对象*/
        } 
        else if ( data >0 && data<100)
        {
            throw small();/*抛出对象*/
        }
        else  if (data>10000)
        {
            throw big();/*抛出对象*/
        }
        else if (data>100 && data<10000)
        {
            a = data;
        }
        else
        {
            throw wrong();/*抛出对象*/
        }       
    }
    int  gettiji()
    {
         return  a*a*a;
    }
    class zero
    {
        public:
            int errorcode;
    }; 
    class wrong{};
    class big{};
    class small{};
private:
    int a;//变长
};
void main()
{
    try
    {
        box newbox(0);
    }
    catch (box::zero w)
    {
        if (w.errorcode==22)
        {
            cout << "22号错误正方体长度不可以为0";
        } 
        else
        {
            cout << "fei22号错误正方体长度不可以为0";
        }
    }
    catch (box::wrong)
    {
        cout << "正方体长度异常";
    }
    catch (box::big)
    {
        cout << "正方体长度太长";
    }
    catch (box::small)
    {
        cout << "正方体长度taiduan";
    }
    cin.get();
}

四、异常类的派生:

#include<iostream>
#include <string>
using namespace std;

class box   //正方体
{
public:
    box(int data)
    {
        cout << "开始构造";
        if (data == 0)
        {
            zero z1(22);
            z1.seterror(21);
            throw z1;
        }
        else if (data > 0 && data<100)
        {
            throw small();/*抛出对象*/
        }
        else  if (data>10000)
        {
            throw big();/*抛出对象*/
        }
        else if (data > 100 && data < 10000)
        {
            a = data;
        }
        else
        {
            throw wrong();/*抛出对象*/
        }
    }
    int  gettiji()
    {
        return  a*a*a;
    }
    class wrong{};
    class big{};
    class small{};
    class zero :public small 
    /*两种错误的处理方式都接受,在处理的时候遇到任何一种都会处理,看catch的先后顺序执行哪个错误处理方式*/
    {
    public:
        int errorcode;
        zero(int i) :errorcode(i)
        {       }
        void  seterror(int i)
        {
            errorcode = i;
        }
    };
private:
    int a;//变长
};
void main()
{
    try
    {
        box newbox(0);
    }
    catch (box::wrong)
    {
        cout << "正方体长度异常";
    }
    catch (box::big)
    {
        cout << "正方体长度太长";
    }
    catch (box::zero  w)
    {
        if (w.errorcode == 22)
        {
            cout << "22号错误正方体长度不可以为0";
        }
        else
        {
            cout << "fei22号错误正方体长度不可以为0";
        }
    }
    catch (box::small)
    {
        cout << "正方体长度taiduan";
    }
    cin.get();
}

五、虚函数的异常:

#include<iostream>
#include <string>
using namespace std;

class box   //正方体
{
public:
    box(int data)
    {
        cout << "开始构造";

        if (data == 0)
        {
            zero z1(22);
            z1.seterror(21);
            throw z1;
        }
        else if (data > 0 && data<100)
        {
            throw small();
        }
        else  if (data>10000)
        {
            throw big();
        }
        else if (data > 100 && data < 10000)
        {
            a = data;
        }
        else
        {
            throw wrong();
        }
    }
    int  gettiji()
    {
        return  a*a*a;
    }
    class wrong
    {
    public:
        virtual void show()//虚函数
        {
            cout << "wrong" << endl;
        }
    };
    class big:public wrong
    {
    public:
        void show()
        {
            cout << "big  wrong" << endl;
        }
    };
    class small:public wrong
    {
    public:
        void show()
        {
            cout << "small  wrong" << endl;
        }
    };
    class zero :public small  
    {
    public:
        int errorcode;
        zero(int i) :errorcode(i)
        {       }
        void  seterror(int i)
        {
            errorcode = i;
        }
    };
private:
    int a;//变长
};
void main()
{
    try
    {
        box newbox(11168);
    }
    catch (box::zero w)
    {
        if (w.errorcode == 22)
        {
            cout << "22号错误正方体长度不可以为0";
        }
        else
        {
            cout << "fei22号错误正方体长度不可以为0";
        }

    }
    //虚函数一个接口处理多个错误
    catch (box::wrong &wrong1) 
    //引用是指针实现的,用一个父类的引用,引用子类对象,如果有虚函数,都会调用子类实现的方法
    {
        wrong1.show();
    }
    cin.get();
}

六、模板类的异常:

#include<iostream>
using namespace std;
//typename会明确类型

//模板的异常,处理通用数据类型,类中包含一个如何使用
//虚函数,虚函数可以指针,引用来实现。
//异常处理机制,一个接口处理通用的异常
template <class T>
class Array
{
public:
    class wrong
    {
    public:
        Virtual void show()
        {
            cout << "wrong"<< typeid(T).name();
        }
    };
    class big :public wrong
    {
    public:
        int x;
        big(int n) :x(n)
        {       }
        void show()
        {
            cout << " big  wrong" << x << typeid(T).name();;
        }
    };
    class small :public wrong
    {
    public:
        int x;
        small(int n) :x(n)
        {       }
        void show()
        {
            cout << " small  wrong" << x << typeid(T).name();;
        }
    };
    Array(int n)
    {
       if (n>0 && n<10)
       {
           throw small(n);
       } 
       else if (n>10000)
       {
           throw big(n);
       }
       else if (n<0)
       {
           throw wrong();
       }
       else
       {
           p = new T[n];
           size = n;
       }    
    }
private:
    int size;
    T *p;
};
void main()
{
    try
    {
        Array<double> mya(1);
    }
    catch (Array<double>::wrong & wrong1)
    {
        wrong1.show();
    }
    cin.get();
}

七、内存异常

#include<iostream>
#include<string>
using namespace std;

class stduent
{
public:
    stduent()
    {
        cout << "构造" << endl;
    }
    ~stduent()
    {
        cout << "析构" << endl;
    }
};
class X
{
    public:
        void *p;//存储地址
        char str[30];
        X(void *pt):p(pt)
        {   }
};//处理异常
bool quit = false;//
void run()
{
    stduent *p = new stduent;
    //delete p;
    //p = nullptr;
    if (p!=nullptr)//异常检测泄漏
    {
        quit = true;
        if (quit == true)
        {
            throw X(reinterpret_cast<void *>(p));//抛出异常
        }
    }
}
void main()
{
    try
    {
        run();
    }
    catch (X e)
    {
        cout << "内存异常,内存泄漏"<<e.p;
    }
    cin.get();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值