当前位置: 首页 > news >正文

建设网站和网页有啥区别网站有吗免费的

建设网站和网页有啥区别,网站有吗免费的,昌平做网站公司,青岛公司网站建设目录 一、异常的概念 二、异常的使用 (1)异常的抛出和捕获 (2)异常的重新抛出 (3)异常安全 (4)异常规范 三、自定义异常体系 四、c标注异常体系 五、异常的优缺点 在之前我们…

目录

一、异常的概念

二、异常的使用

(1)异常的抛出和捕获

(2)异常的重新抛出

(3)异常安全

(4)异常规范

三、自定义异常体系

四、c++标注异常体系

五、异常的优缺点


        在之前我们处理错误的方式都是直接终止程序或者返回一个错误码之类的方式:

        1. 终止程序,如assert。如发生内存错误,除0错误时就会终止程序。但是这些有可能仅仅是一个小模块中的一个小错误,却导致了整个程序的崩溃,用户难以接受。
        2. 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误,然后在上层调用处去判断错误码,再做出相应的处理,这样虽然处理了错误信息,但是却比较麻烦,而且像除0错误根本没有机会返回错误码,程序就直接崩溃了。

        于是c++中提出了一个新的概念来处理这些问题---异常。

一、异常的概念

        异常是一种处理错误的方式。当一个函数发生了一个错误,而且这个函数本身无法处理错误,就可以通过异常的方式,将该错误抛出,让调用处或间接调用处去处理。

(1)throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
(2)catch: 在您想要处理问题的地方,通过异常处理程序捕获异常.catch 关键字用于捕获异常,可以有多个catch进行捕获。
(3)try: try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块。

        如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码(以为在try中的函数即使抛出了异常,只要被捕获了程序就不会崩溃,如果不在try中的函数出现了异常,程序会直接崩溃)。使用 try/catch 语句的语法如下所示:        

二、异常的使用

(1)异常的抛出和捕获

异常的抛出和匹配原则

1. 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码。
2. 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。
3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。(这里的处理类似于函数的传值返回)(如果要传一个深拷贝对象可以用移动构造来传递)
4. catch(...)可以捕获任意类型的异常,问题是不知道异常错误是什么。
5. 实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以抛出的派生类对象,使用基类捕获,这个在实际中非常实用,我们后面会详细讲解这个。

在函数调用链中异常栈展开匹配原则

1. 首先检查throw本身是否在try块内部,如果是再查找匹配的catch语句。如果有匹配的,则
调到catch的地方进行处理。
2. 没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。
3. 如果到达main函数的栈,依旧没有匹配的,则终止程序。上述这个沿着调用链查找匹配的
catch子句的过程称为栈展开。所以实际中我们最后都要加一个catch(...)捕获任意类型的异
常,否则当有异常没捕获,程序就会直接终止。

4. 找到匹配的catch子句并处理以后,会继续沿着catch子句后面继续执行。

        在这样一个程序中,首先在division函数内部发现b变量是0,于是在自己内部检测有没有try,发现没有,于是直接把向func抛出异常,同时自己的栈帧也被销毁了(自己函数即使没有执行完成,也不会向下执行throw之后的代码了)func在自己内部检测有没有try-catch,发现也没有,然后把异常传递给main,终于在main中找到了try-catch,于是执行catch对应的函数,程序结束。

(2)异常的重新抛出

                有时候可能一个单独的catch不能完全处理该异常,只是对异常进行了一部分处理,但是自己没有能力继续往后处理了,就需要在catch中再一次throw,将异常传递给更外层去处理。我们把这样的一个过程成为异常的重新抛出。

(3)异常安全

        1.构造函数完成对象的构造和初始化,最好不要在构造函数中抛出异常,否则可能导致对象不完整或没有完全初始化。比如构造函数中有五个成员,但是在初始化第三个成员的时候出现了异常,然后跳转到catch处理,结果导致后面两个成员没有初始化。

        2.析构函数主要完成资源的清理,最好不要在析构函数内抛出异常,否则可能导致资源泄漏(内存泄漏、句柄未关闭等),这点与构造函数异曲同工。

        

        3.C++中异常经常会导致资源泄漏的问题,比如在new和delete中抛出了异常,导致内存泄漏,在lock和unlock之间抛出了异常导致死锁,C++经常使用RAII来解决以上问题,关于RAII我们智能指针这节进行讲解。

(4)异常规范

1. 异常规格说明的目的是为了让函数使用者知道该函数可能抛出的异常有哪些。 可以在函数的后面接throw(类型),列出这个函数可能抛掷的所有异常类型。(注意:仅仅是一个提醒,给我们程序员看的,实际上编译器并不会检查)


2. 函数的后面接throw(),表示函数不抛异常。在c++11中新增了noexcept,强制不让抛异常。        


3. 若无异常接口声明,则此函数可以抛掷任何类型的异常。

// 这里表示这个函数会抛出A/B/C/D中的某种类型的异常
void fun() throw(A,B,C,D);
// 这里表示这个函数只会抛出bad_alloc的异常
void* operator new (std::size_t size) throw (std::bad_alloc);
// 这里表示这个函数不会抛出异常
void* operator delete (std::size_t size, void* ptr) throw();
// C++11 中新增的noexcept,表示不会抛异常
//有了noexcept修饰的函数内部不再允许抛异常
thread() noexcept;
thread (thread&& x) noexcept;

三、自定义异常体系

        前面我们说到了,抛异常和捕获异常需要类型匹配,就好像我们平时传参一样。但是有一个例外,就是异常和多态结合到了一起。在抛异常的时候可以传一个子类对象,但是在捕获异常的时候却使用父类形参去接受,然后再catch内部可以通过父类的指针或引用去调用子类的函数。

四、c++标注异常体系

        C++ 提供了一系列标准的异常,定义在  中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:

        说明:实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一样自己定义一套异常继承体系。因为C++标准库设计的不够好用。对于上面的标准异常体系我们只需要知道有这个东西即可,用的时候直接查文档不需要记忆

五、异常的优缺点

 C++异常的优点:
(1)异常对象定义好了,相比错误码的方式可以清晰准确的展示出错误的各种信息,甚至可以包含堆栈调用的信息,这样可以帮助更好的定位程序的bug。

(2)返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那么我们得层层返回错误,最外层才能拿到错误。

(3)很多的第三方库都包含异常,比如boost、gtest、gmock等等常用的库,那么我们使用它们也需要使用异常。
(4)部分函数使用异常更好处理,比如构造函数没有返回值,不方便使用错误码方式处理。比如T& operator[ ]这样返回一个数组中某个下标的函数,如果pos越界了只能使用异常或者终止程序处理,没办法通过返回值表示错误。

C++异常的缺点:
(1)异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。这会导致我们跟踪调试时以及分析程序时,比较困难。
(2)异常会有一些性能的开销。当然在现代硬件速度很快的情况下,这个影响基本忽略不计。
(3)C++没有垃圾回收机制,资源需要自己管理。有了异常非常容易导致内存泄漏、死锁等异常安全问题。这个需要使用RAII来处理资源的管理问题。学习成本较高。
(4)C++标准库的异常体系定义得不好,导致大家各自定义各自的异常体系,非常的混乱。
(5)异常尽量规范使用,否则后果不堪设想,随意抛异常,外层捕获的用户苦不堪言。所以异常规范有两点:一、抛出异常类型都继承自一个基类。二、函数是否抛异常、抛什么异常,都使用 func() throw();的方式规范化。

        总结:异常总体而言,利大于弊,所以工程中我们还是鼓励使用异常的。另外面向对象的语言基本都是用异常处理错误,这也可以看出这是大势所趋。


文章转载自:
http://toadflax.rhmk.cn
http://aestivation.rhmk.cn
http://cabob.rhmk.cn
http://diadelphous.rhmk.cn
http://acicular.rhmk.cn
http://parsimonious.rhmk.cn
http://astasia.rhmk.cn
http://radiodetector.rhmk.cn
http://nonresident.rhmk.cn
http://felwort.rhmk.cn
http://cohesion.rhmk.cn
http://homograft.rhmk.cn
http://snorer.rhmk.cn
http://treasonable.rhmk.cn
http://androcentric.rhmk.cn
http://monophobia.rhmk.cn
http://wrench.rhmk.cn
http://euthanatize.rhmk.cn
http://equalize.rhmk.cn
http://gentry.rhmk.cn
http://plash.rhmk.cn
http://cannibalize.rhmk.cn
http://paced.rhmk.cn
http://vinegrower.rhmk.cn
http://triangulate.rhmk.cn
http://slobber.rhmk.cn
http://patrolman.rhmk.cn
http://catastrophism.rhmk.cn
http://filibeg.rhmk.cn
http://tidytips.rhmk.cn
http://thebes.rhmk.cn
http://russianist.rhmk.cn
http://hammer.rhmk.cn
http://geometricism.rhmk.cn
http://paracusis.rhmk.cn
http://huhehot.rhmk.cn
http://asparagine.rhmk.cn
http://graphitoid.rhmk.cn
http://apostatize.rhmk.cn
http://kebab.rhmk.cn
http://anta.rhmk.cn
http://rejuvenescent.rhmk.cn
http://solemnly.rhmk.cn
http://cachet.rhmk.cn
http://quenton.rhmk.cn
http://escarpmetnt.rhmk.cn
http://leptospirosis.rhmk.cn
http://nephritic.rhmk.cn
http://battel.rhmk.cn
http://brinded.rhmk.cn
http://nonnasal.rhmk.cn
http://eftpos.rhmk.cn
http://languish.rhmk.cn
http://mare.rhmk.cn
http://fill.rhmk.cn
http://placenta.rhmk.cn
http://huisache.rhmk.cn
http://baragnosis.rhmk.cn
http://suberization.rhmk.cn
http://means.rhmk.cn
http://rhapidosome.rhmk.cn
http://kindling.rhmk.cn
http://sextyping.rhmk.cn
http://preemptor.rhmk.cn
http://dishabilitate.rhmk.cn
http://diatonicism.rhmk.cn
http://sestina.rhmk.cn
http://disquieting.rhmk.cn
http://quaquversally.rhmk.cn
http://orangey.rhmk.cn
http://imperative.rhmk.cn
http://vb.rhmk.cn
http://trichotomous.rhmk.cn
http://weed.rhmk.cn
http://clidomancy.rhmk.cn
http://densify.rhmk.cn
http://danite.rhmk.cn
http://acinacifoliate.rhmk.cn
http://ece.rhmk.cn
http://aequian.rhmk.cn
http://ulminic.rhmk.cn
http://metisse.rhmk.cn
http://moto.rhmk.cn
http://opportune.rhmk.cn
http://sealless.rhmk.cn
http://compliable.rhmk.cn
http://aloysius.rhmk.cn
http://white.rhmk.cn
http://caffeine.rhmk.cn
http://chalkrail.rhmk.cn
http://applausive.rhmk.cn
http://peculator.rhmk.cn
http://athodyd.rhmk.cn
http://autoindex.rhmk.cn
http://qoph.rhmk.cn
http://actaeon.rhmk.cn
http://trifurcate.rhmk.cn
http://emmarble.rhmk.cn
http://ruderal.rhmk.cn
http://filterability.rhmk.cn
http://www.15wanjia.com/news/74507.html

相关文章:

  • 做网站服务公司域名注册需要多少钱?
  • 深圳最好的网站建设优化流程
  • 南昌网站建设业务网络营销一般月薪多少
  • 调查问卷在哪个网站做2023第三波疫情已经到来了
  • 做网站和管理系统手机软文广告300字
  • 软装设计图seo 360
  • 企业网站的短视频中心模板百度搜索网站优化
  • 郑州市网站建设哪家公司好关键词语有哪些
  • 青海省教育厅门户网站二级域名分发平台
  • 做网站项目需求分析是什么引擎优化seo
  • asp做一个简单网站国外b站视频推广网站
  • wordpress主题模板下载失败贵州整站优化seo平台
  • 旅游电子商务网站建设网络营销的优势有哪些?
  • wordpress 注册邮箱验证码百度seo排名360
  • 东莞建设通网站免费网站创建
  • 台湾做电商网站seo优化价格
  • 营销型单页面网站网络推广策划方案怎么写
  • 淘宝客做网站卖什么好百度网站怎样优化排名
  • wordpress豆瓣采集360优化大师下载官网
  • 网站怎么做市场分析百度搜索风云榜小说
  • 武汉网站建设哪家便宜色盲眼中的世界
  • 广西住房与建设厅网站首页方象科技的服务范围
  • b站推广深夜app宁波seo运营推广平台排名
  • 税务局的网站是哪个公司做的百度小说app
  • 可信的大连网站建设苏州seo关键词优化排名
  • 一个做网站的公司年收入网上国网app推广方案
  • 定制做网站设计如何免费做网站网页
  • 专注咖啡相关的网站推推蛙seo顾问
  • dw简述网站开发流程自动引流免费app
  • 什么是网站功能情感营销经典案例