友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第36章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                     3。 throw 。这是一个指令,用来产生(抛出)一个exception 。 



96 


…………………………………………………………Page 159……………………………………………………………

                                                       第2章  C++ 的重要性伲�



 下面是个实例  : 



    try { 

          // try block。 

    } 

    catch (char *p) { 

          printf(〃Caught a char* exception; value %sn〃;p); 

    } 

    catch (double d) { 

          printf(〃Caught a numeric exception; value %gn〃;d); 

    } 

    catch (。。。) {  // catch anything 

          printf(〃Caught an unknown exceptionn〃); 

    } 



MFC 早就支持exception,不过早期它用的是非标准语法。Visual C++ 4。0 编译器本身支 



持完整的C++ exceptions,MFC 也因此有了两个exception 版本:你可以使用语言本身 



提供的性能,也可以沿用MFC 古老的方法(以宏形式出现)。人们曾经因为MFC  的 



方案不同于ANSI 标准而非难它,但是不要忘记它已经运作了多少年。 



MFC  的exceptions 机制是以宏和exception types 为基础。这些宏类似C++  的 



exception 保留字,动作也满像。MFC  以下列宏仿真C++ exception handling: 



    TRY 

    CATCH(type;object) 

    AND_CATCH(type;object) 

    END_CATCH 

    CATCH_ALL(object) 

    AND_CATCH_ALL(object) 

    END_CATCH_ALL 

    END_TRY 

    THROW() 

    THROW_LAST() 



MFC 所使用的语法与日渐浮现的标准稍微不同,不过其间差异微不足道。为了以MFC 



捕捉exceptions,你应该建立一个TRY  区块,下面接着CATCH  区块: 



    TRY { 

          // try block。 

    } 

    CATCH (CMemoryException; e) { 



                                                                                      97 


…………………………………………………………Page 160……………………………………………………………

                    第篇  勿在浮砂築高台 



                              printf(〃Caught a memory exception。n〃); 

                         } 

                        AND_CATCH_ALL (e) { 

                              printf(〃Caught an exception。n〃); 

                         } 

                        END_CATCH_ALL 



                    THROW 宏相当于C++ 语言中的throw 指令;你以什么类型做为THROW 的参数,就 



                   会有一个相对应的AfxThrow_  函数被调用(这是台面下的行为): 



                    MFC Exception Type      MFC Throw Function              DOS support  Windows support 



                    CException                                              v            v 



                    CMemoryException        AfxThrowMemoryException         v            v 



                    CFileException          AfxThrowFileException           v            v 



                    CArchiveException       AfxThrowArchiveException        v            v 



                    CNotSupportedException  AfxThrowNotSupportedException   v            v 



                    CResourceException      AfxThrowResourceException                    v 



                    COleException           AfxThrowOleException                         v 



                    COleDispatchException   AfxThrowOleDispatchException                 v 



                    CDBException            AfxThrowDBException                          v 



                    CDaoException           AfxThrowDaoException                         v 



                    CUserException          AfxThrowUserException                        v 



                    以下是MFC 4。x  的exceptions 宏定义: 



                    // in AFX。H 

                    //////////////////////////////////////////////////////////////////////// 

                    // Exception macros using try; catch and throw 

                    //  (for backward patibility to previous versions of MFC) 



                    #ifndef _AFX_OLD_EXCEPTIONS 



                    #define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try { 



98 


…………………………………………………………Page 161……………………………………………………………

                                                       第2章  C++ 的重要性伲�



#define CATCH(class; e) } catch (class* e)  

        { ASSERT(e…》IsKindOf(RUNTIME_CLASS(class)));  

                _afxExceptionLink。m_pException = e; 



#define AND_CATCH(class; e) } catch (class* e)  

        { ASSERT(e…》IsKindOf(RUNTIME_CLASS(class)));  

                _afxExceptionLink。m_pException = e; 



#define END_CATCH } } 



#define THROW(e) throw e 

#define THROW_LAST() (AfxThrowLastCleanup(); throw) 



// Advanced macros for smaller code 

#define CATCH_ALL(e) } catch (CException* e)  

        { { ASSERT(e…》IsKindOf(RUNTIME_CLASS(CException)));  

                _afxExceptionLink。m_pException = e; 



#define AND_CATCH_ALL(e) } catch (CException* e)  

        { { ASSERT(e…》IsKindOf(RUNTIME_CLASS(CException)));  

                _afxExceptionLink。m_pException = e; 



#define END_CATCH_ALL } } } 



#define END_TRY } catch (CException* e)  

        { ASSERT(e…》IsKindOf(RUNTIME_CLASS(CException)));  

                _afxExceptionLink。m_pException = e; } } 



#else //_AFX_OLD_EXCEPTIONS 



//////////////////////////////////////////////////////////////////////// 

// Exception macros using setjmp and longjmp 

//  (for portability to pilers with no support for C++ exception handling) 



#define TRY  

        { AFX_EXCEPTION_LINK _afxExceptionLink;  

        if (::setjmp(_afxExceptionLink。m_jumpBuf) == 0) 



#define CATCH(class; e)  

        else if (::AfxCatchProc(RUNTIME_CLASS(class)))  

        { class* e = (class*)_afxExceptionLink。m_pException; 



#define AND_CATCH(class; e)  

        } else if (::AfxCatchProc(RUNTIME_CLASS(class)))  

        { class* e = (class*)_afxExceptionLink。m_pException; 



                                                                                       99 


…………………………………………………………Page 162……………………………………………………………

                 第篇  勿在浮砂築高台 



                 #define END_CATCH  

                         } else { ::AfxThrow(NULL); } } 



                 #define THROW(e) AfxThrow(e) 

                 #define THROW_LAST() AfxThrow(NULL) 



                 // Advanced macros for smaller code 

                 #define CATCH_ALL(e)  

                         else { CException* e = _afxExceptionLink。m_pException; 



                 #define AND_CATCH_ALL(e)  

                         } else { CException* e = _afxExceptionLink。m_pException; 



                 #define END_CATCH_ALL } } 



                 #define END_TRY } 



                 #endif //_AFX_OLD_EXCEPTIONS 



          Template 



                 这并不是一本C++ 书籍,我也并不打算介绍太多距离「运用MFC 」主题太远的C++ 论 



                 题。Template 虽然很重要,但它与「运用MFC 」有什么关系?有!第8章当我们开始 



                 设计Scribble 程序时,需要用到MFC  的collection classes ,而这一组类别自从MFC 3。0 



                 以来就有了template 版本(因为Visual C++ 编译器从2。0 版开始支持C++ template)。 



                 运用之前,我们总该了解一下新的语法、精神、以及应用。 



                 好,到底什么是template?重要性如何?Kaare Christian 在1994/01/25 的PC…Magazine 



                 上有一篇文章,说得很好: 



                 无性生殖并不只是存在于遗传工程上,对程序员而言它也是一个由来已久的动作。过去, 



                 我们只不过是以一个简单而基本的工具,也就是一个文字编辑器,重制我们的程序代码。 



                 今天,C++ 提供给我们一个更好的繁殖方法:template 。 



                 复制一段既有程序代码的一个最平常的理由就是为了改变数据类型。举个例子,假设你写 



                 了一个绘图函数,使用整数x; y 坐标;突然之间你需要相同的程序代码,但坐标值改采 



100 


…………………………………………………………Page 163……………………………………………………………

                                                       第2章  C++ 的重要性伲�



          long。你当然可以使用一个文字编辑器把这段码拷贝一份,然后把其中的数据类型改变 



          过来。有了C++,你甚至可以使用多载(overloaded )函数,那么你就可以仍旧使用相 



   
返回目录 上一页 下一页 回到顶部 赞(0) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!