zoukankan      html  css  js  c++  java
  • (转载)VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)

    上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理。

           在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还没有学过这方面内容,可以到那节教程中去学习下。

           MFC异常处理与C++标准异常处理是类似的,只是它在抛出和捕获异常时使用了一些宏,另外还将异常封装到了CException类及其派生类中。下面就分别讲解这些宏与异常类。

           MFC异常宏

           MFC提供的异常处理宏包括TRY、CATCH、AND_CATCH、END_CATCH、THROW、THROW_LAST等,大家看着名称是不是与C++标准异常处理的关键字相似?它们实际上就是在try、catch和throw的基础上定义的。鸡啄米下面贴出MFC中这些宏的定义:

    C++代码
    1. /////////////////////////////////////////////////////////////////////////////  
    2. // Exception macros using try, catch and throw   
    3. //  (for backward compatibility to previous versions of MFC)   
    4.   
    5. #define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try {   
    6.   
    7. #define CATCH(class, e) } catch (class* e)    
    8.     { ASSERT(e->IsKindOf(RUNTIME_CLASS(class)));    
    9.         _afxExceptionLink.m_pException = e;   
    10.   
    11. #define AND_CATCH(class, e) } catch (class* e)    
    12.     { ASSERT(e->IsKindOf(RUNTIME_CLASS(class)));    
    13.         _afxExceptionLink.m_pException = e;   
    14.   
    15. #define END_CATCH } }   
    16.   
    17. #define THROW(e) throw e   
    18. #define THROW_LAST() (AfxThrowLastCleanup(), throw)   
    19.   
    20. // Advanced macros for smaller code   
    21. #define CATCH_ALL(e) } catch (CException* e)    
    22.     { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException)));    
    23.         _afxExceptionLink.m_pException = e;   
    24.   
    25. #define AND_CATCH_ALL(e) } catch (CException* e)    
    26.     { { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException)));    
    27.         _afxExceptionLink.m_pException = e;   
    28.   
    29. #define END_CATCH_ALL } } }   
    30.   
    31. #define END_TRY } catch (CException* e)    
    32.     { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException)));    
    33.         _afxExceptionLink.m_pException = e; } }  

           可以看出这些宏的定义中都包含了相应的C++异常处理关键字,本质上还是要通过try、catch和throw实现。

    MFC异常处理

           MFC异常类

           MFC将对异常的处理封装到了异常类--CException类及其子类中。其实即使我们不使用MFC异常宏而是使用C++标准异常处理的话,也是会用到MFC的CException类及其子类的。MFC异常类及其含义如下表:

    MFC异常类 含义
    CSimpleException 资源紧张异常的基类
    CInvalidArgException 无效参数异常
    CMemoryException 内存不足
    CNotSupportedException 响应对不支持服务的请求
    CArchiveException 存档/序列化异常
    CFileException 文件异常
    CResourceException Windows 资源分配异常
    COleException OLE 异常
    CDBException 数据库异常(ODBC 类)
    COleDispatchException 调度(自动化)异常
    CUserException 用消息框警告用户然后引发一般CException 的异常
    CDaoException 数据库异常(DAO 类)
    CInternetException 网络异常

            MFC异常处理

            MFC异常处理的TRY块的形式如下:

    TRY   
    {   
             复合语句   
    }   
    CATCH (MFC异常类名, 变量名)   
    {   
             复合语句   
    }   
    AND_CATCH (MFC异常类名, 变量名)   
    {   
             复合语句   
    }   
    AND_CATCH (MFC异常类名, 变量名)   
    {   
             复合语句   
    }   
    ......   
    END_CATCH

           说明:TRY后的一对大括号内包含了可能会抛出异常的代码块;用CATCH子句捕获并处理异常,它捕获的是指向异常对象的指针,小括号中的“MFC异常类名”就是CException类或其子类的名称,变量名代表的就是“MFC异常类名”类型的指针变量;如果抛出的异常类型与CATCH子句中的不一致,则对后面的所有AND_CATCH子句依次检查,若子句的异常类型与抛出异常类型一致则由其捕获并处理此异常;最后用END_CATCH结束整个TRY块。

           注意:MFC异常宏只能捕获处理CException及其子类类型的异常

           我们在使用MFC类时,有些会自动抛异常,当然我们可以在需要的情况下使用AfxThrow******()自己抛异常,这里的******与上面MFC异常类列表中的各个异常类对应,例如抛文件异常可以使用AfxThrowFileException(),参数可以查阅MSDN。

           MFC异常处理实例

           鸡啄米给大家一个简单的MFC异常处理的代码段,了解下如何使用MFC异常处理即可。

    C++代码
    1. TRY   
    2. {   
    3.     CFile file(_T("C:\1.txt"), CFile::modeRead);   // 构造CFile对象file,并以只读模式打开一个文件,如果不存在则抛出CFileException异常   
    4. }   
    5. CATCH (CFileException, e)   
    6. {   
    7.     if (e->m_cause == CFileException::fileNotFound)   
    8.     {   
    9.         // 如果捕获到CFileException异常且为文件未找到时,弹出提示对话框   
    10.         MessageBox(_T("file not found!"));   
    11.         return;   
    12.     }   
    13. }   
    14. END_CATCH  

           上面这段代码的意义很简单,就是打开一个文件C:1.txt,如果此文件不存在,则抛出CFileException异常,由CATCH子句捕获后判断是否是文件未找到,如果是则弹出提示对话框并返回。

           再将上面的代码稍微修改下,以演示AfxThrow******()抛异常的用法:

    C++代码
    1. TRY   
    2. {   
    3.     AfxThrowFileException(CFileException::fileNotFound);   // 手动抛出CFileException异常   
    4. }   
    5. CATCH (CFileException, e)   
    6. {   
    7.     if (e->m_cause == CFileException::fileNotFound)   
    8.     {   
    9.         // 如果捕获到CFileException异常且为文件未找到时,弹出提示对话框   
    10.         MessageBox(_T("file not found!"));   
    11.         return TRUE;   
    12.     }   
    13. }   
    14. END_CATCH  

           上面这段代码执行时,在CATCH子句中会捕获到文件异常。

           最后提醒大家一下,MFC的建议是不再使用MFC异常宏,而是直接使用C++标准异常,它更加灵活。鸡啄米谢谢您对本站的持续关注,希望常回来看看。

    原文地址:http://www.jizhuomi.com/software/236.html

  • 相关阅读:
    caffe常用层: batchNorm层和scale层
    简述configure、pkg-config、pkg_config_path三者的关系
    python删除list中元素的三种方法
    Leetcode 872. Leaf-Similar Trees
    Leetcode 508. Most Frequent Subtree Sum
    Leetcode 572. Subtree of Another Tree
    Leetcode 894. All Possible Full Binary Trees
    Leetcode 814. Binary Tree Pruning
    Leetcode 557. Reverse Words in a String III
    python 多维list声明时的小问题
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/6758651.html
Copyright © 2011-2022 走看看