当前位置:首页技术教程第十八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人
第十八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人
°
  • 素材类型: 原创-素材
  • 上传时间:

异常在编程中是一个非常重要的概念,它指的是程序在执行过程中出现的非正常的情况。异常可能导致程序无法正常运行或产生错误的结果。
在许多编程语言中,异常是一个对象,它包含了关于异常的详细信息,例如异常类型、异常消息和异常堆栈跟踪。当程序中出现异常时,会创建一个相应的异常对象,并将该对象传递给处理程序。处理程序可以是程序中指定的异常处理器,也可以是默认的异常处理程序。
异常处理程序会根据异常的类型和消息,采取适当的行动来处理异常。它可以记录异常信息、恢复程序的执行或采取其他措施来解决问题。在某些情况下,异常处理程序还可以修改程序的行为或返回值,以避免程序崩溃或提供有关错误的信息。
异常处理是编程中一个重要的部分,它可以帮助开发人员更好地控制程序的执行流程,提高程序的稳定性和可靠性。通过使用异常处理机制,开发人员可以及时发现和修复错误,避免程序崩溃或产生不正确的结果。
第十八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人
  1. 异常
    11.1.引例
#include <iostream>
using namespace std;
int divide(int x, int y)
{
    if(y == 0)
        throw('a');
    return x/y;
}
int myDivide(int x, int y)
{
    divide(x,y) ;
}
int main()
{
    try{
        myDivide(4,0);
    }catch(int x){
        cout<<"x"<<endl;
        cout<<x<<endl;
    }catch(double y){
        cout<<"y"<<endl;
        cout<<y<<endl;
    }catch(...){
        cout<<"no x, no y"<<endl;
    }
    return 0;
}

小结:

1,函数定义在有可能发生错误的地方,设立异常抛出。可以抛出任意类型(包括内嵌类型或自定义类型)。

2,try-catch 结构,try 结构包含可能发生异常的函数。catch 模块是异常发生时走的分支,跟抛出类型进行严格匹配。可以有多个 catch 块。

try

{ 被检查的语句}

catch(异常信息类型 [变量名])

{ 进行异常处理的语句}

3. 异常的抛出,可以跨函数。省却函数层层返回,这也是他的优势。

4,catch(…)作为抛出类型不匹配的分支。

5,如无匹配的分支,系统由会调用 terminate,使其终止,并提示信息。

11.2.引入模板的意义

第十八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以再适当的位置设计对不同类型异常的处理。

2)异常是专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试,如图

第十八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

3)异常超脱于函数机制,决定了其对函数的跨越式回跳。

4)异常跨越函数

11.3.引入异常需要解决的问题

11.3.1. 抛出类型声明

1为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型。

例如:

void func() throw (A, B, C , D); //这个函数 func()能够且只能抛出类型 A B C D 及其子

类型的异常。

2如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常,例如:

void func();

3一个不抛掷任何类型异常的函数可以声明为:

void func() throw();

4)如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected 函数会被调用,该函数默认行为调用 terminate 函数中止程序。

11.3.2. 栈自旋

异常被抛出后,从进入 try 块起,到异常被抛掷前,这期间在栈上的构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋(unwinding)。而堆上的空间,则会泄漏。

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"A constructor"<<endl;
    }
    ~A()
    {
        cout<<"~A destructor"<<endl;
    }
};
int divide(int x, int y)
{
    A a;
    if(y == 0)
        throw('a');
    return x/y;
}
int myDivide(int x, int y)
{
    A b;
    divide(x,y) ;
}
int main()
{
    try{
        myDivide(4,0);
    }catch(int x){
        cout<<"x"<<endl;
        cout<<x<<endl;
    }catch(double y){
        cout<<"y"<<endl;
        cout<<y<<endl;
    }catch(...){
    cout<<"no x, no y"<<endl;
    }
    return 0;
}

11.3.3. 返回类对象(引用,实例)

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"A constructor"<<endl;
    }
    A(const A & )
    {
        cout<<"A copy constructor"<<endl;
    }
    ~A()
    {
        cout<<"~A destructor"<<endl;
    }
};
int divide(int x, int y)
{
    A a;
    if(y == 0)
        throw(a);
    return x/y;
}
int myDivide(int x, int y)
{
    divide(x,y) ;
}
int main()
{
    try{
        myDivide(4,0);
    }catch(int x){
        cout<<"x"<<endl;
        cout<<x<<endl;
    }catch(double y){
        cout<<"y"<<endl;
        cout<<y<<endl;
    }catch(const A &a){
        cout<<"no x, no y"<<endl;
    }
    return 0;
}

12. STL

13. C11

14. Boost

15. 附录

15.1.运算符优先级

第十八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

15.2.ASCII 码

C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人教程至此全部结束!有需要的可以到本站下载PDF版本感谢支持

温馨提示:

文章标题:第十八章丨C++编程宝典:快速上手、深入进阶、挑战高级技巧,助你成为编程达人

文章链接:https://www.xiciw.com/jsjc/1230.html

更新时间:2024年02月07日

本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:xiciw#qq.com我们将第一时间处理!

资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。

                               

所有资源仅限于参考和学习,版权归原作者所有,更多请阅读菜鸟资源服务协议

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
Macos教程Windows教程技术教程

在浏览器中“ERR_NAME_NOT_RESOLVED”错误如何修复此 DNS 错误

2024-2-7 4:48:19

技术教程

逐步解析指针与运算符的优先级,让你不再害怕编程中的指针操作

2024-2-8 10:19:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索