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

网站空间购买时选择什么脚本语言移动开发软件

网站空间购买时选择什么脚本语言,移动开发软件,网页设计教程文字与图片,网站开发加盟1. 异常的概念 1.1 异常和错误 异常通常是指在程序运行中动态出现的非正常情况#xff0c;这些情况往往是可以预见并可以在不停止程序的情况下动态地进行处理的。 错误通常是指那些会导致程序终止的#xff0c;无法动态处理的非正常情况。例如#xff0c;越界访问、栈溢出…1. 异常的概念 1.1 异常和错误 异常通常是指在程序运行中动态出现的非正常情况这些情况往往是可以预见并可以在不停止程序的情况下动态地进行处理的。 错误通常是指那些会导致程序终止的无法动态处理的非正常情况。例如越界访问、栈溢出、语法错误等等。错误往往无法预见需要程序员进行调试来发现出错的原因。 1.2 异常处理机制 C提供了一套异常处理机制用于管理和控制程序中可能出现的异常。这个机制基于三个关键的关键字throw、try和catch。 throw关键字用于抛出一个异常。异常可以是任何类型的对象但通常是从std::exception派生的类的实例。try块包围可能会抛出异常的代码。如果在try块中发生异常程序会立即停止执行当前的函数并开始在包含try块的函数上下文中搜索匹配的catch块。catch块定义了异常处理代码。每个catch块都有一个异常声明用于指定它能够捕获的异常类型。当try块中抛出一个异常时程序会尝试匹配catch块中的异常声明并执行匹配的catch块中的代码。 try {// 可能抛出异常的代码// ... } catch(Exception e) {// 处理异常或显示错误信息的代码// ... } // 如果需要可继续增加catch块其中Exception为可接收异常对象的类型(与异常对象的类型相同异常对象的父类异常对象可以发生隐式类型转换的类型)。 与传参的规则相似能传参给e就能捕获其中用父类来捕获子类异常在异常继承体系中非常实用例如除零异常类继承自算术异常类那么就可以使用算术异常类来捕获除零异常。  2. 异常的抛出与捕获 程序出现问题时我们通过抛出(throw)一个对象来引发一个异常该对象的类型以及当前的调用链决定了应该由哪个catch的处理代码来处理该异常。 当异常被抛出后程序会立即跳转到能捕获该异常的最近的catch块处也就是说 (1)当前try块中的代码会立即停止执行并沿着调用链往回匹配能够捕获该异常的catch块。 (2)在匹配catch块的过程中当前函数栈帧未能处理掉异常则函数栈帧会被立即销毁该函数栈帧中已定义的对象全部进入析构流程并返回上一层函数调用继续匹配catch块。 若在返回到main函数之后都未能处理掉异常那么该异常就成为了一个错误程序会立即终止并报错。 #includeiostream #includestring using namespace std;double Divide(int a, int b) {try{// 当b 0时抛出异常if (b 0){string s(Divide by zero condition!);throw s;} else{return ((double)a / (double)b);}} catch(int errid){cout Divide: errid endl;} return 0; } void Func() {int len, time;cin len time;try{cout Divide(len, time) endl;} catch(const char* errmsg){cout Func: errmsg endl;}// 除数为0时此行不会被执行cout __FUNCTION__ : __LINE__ 行执行 endl; } int main() {while (1){try{Func();} catch(const string errmsg){cout main: errmsg endl;}} return 0; } 抛出的异常实质上是异常对象的拷贝因为被抛出的异常对象可能是一个局部对象函数栈帧被销毁之后该对象也会被销毁这里的处理类似于函数传值返回。 但是这里有一个例外就是在使用左值引用捕获异常时异常也能被捕获(一般来说异常对象的拷贝应该是右值无法使用左值引用接收)且此时引用的是原始异常对象原始异常对象的生命周期也被延长至catch块末尾。 异常对象的拷贝在catch块运行结束之后销毁。 3. 异常重新抛出 在catch块中再次使用throw语句会将当前catch块捕获到的异常原样抛出 // 下面程序模拟展⽰了聊天时发送消息发送失败补货异常但是可能在 // 电梯地下室等场景⼿机信号不好则需要多次尝试如果多次尝试都发 // 送不出去则就需要捕获异常再重新抛出其次如果不是网络差导致的 // 错误捕获后也要重新抛出。 void _SeedMsg(const string s) {if (rand() % 2 0){throw HttpException(网络不稳定发送失败, 102, put);} else if (rand() % 7 0){throw HttpException(你已经不是对象的好友发送失败, 103, put);} else{cout 发送成功 endl;} }void SendMsg(const string s) {// 发送消息失败则再重试3次for (size_t i 0; i 4; i){try{_SeedMsg(s);break;} catch(const Exception e){// 捕获异常if中是102号错误网络不稳定则重新发送// 捕获异常else中不是102号错误则将异常重新抛出if (e.getid() 102){// 重试三次以后失败了则说明网络太差了重新抛出异常if (i 3)throw;cout 网络较差开始第 i 1 重试 endl;} else{throw;}}} } int main() {srand(time(0));string str;while (cin str){try{SendMsg(str);} catch(const Exception e){cout e.what() endl endl;} catch(...){cout Unkown Exception endl;}}return 0; } 4. 异常安全问题 4.1 捕获意外的异常和未知异常 前面说过异常如果未被捕获就会成为错误所以我们在main函数中一般会这样来写以避免异常未被捕获的情况 int main() {try{Func();} catch(const Exception e){cout e.what() endl endl;} catch(...){cout Unkown Exception endl;}return 0; } 其中这里的Exception代表异常继承体系中所有异常的父类(自定义了异常继承体系或使用了标准库中的异常继承体系)也就是说其可以接收继承体系中任意类型的异常从而保证意外抛出的异常也能被捕获。 ...代表任意类型的被抛出的异常假如被该块捕获说明该异常不在异常继承体系中是未知的异常。 4.2 异常处理导致的内存泄露 异常抛出后后面的代码就不再执行前面申请了资源(内存、锁等)后面进行释放但是中间可能会抛异常就会导致资源没有释放这里由于异常就引发了资源泄漏产生安全性的问题。 我们可以采取先捕获异常并将资源释放之后重新抛出的方式处理这种情况但这样做代码的可维护性较差后面智能指针章节讲的RAII方式解决这种问题是更好的。 double Divide(int a, int b) {// 当b 0时抛出异常if (b 0){throw Division by zero condition!;} return(double)a / (double)b; } void Func() {// 这里可以看到如果发⽣除0错误抛出异常另外下面的array没有得到释放。// 所以这里捕获异常后并不处理异常异常还是交给外层处理这里捕获了再// 重新抛出去。int* array new int[10];try{int len, time;cin len time;cout Divide(len, time) endl;} catch(...){// 捕获异常释放内存cout delete [] array endl;delete[] array;throw; // 异常重新抛出捕获到什么抛出什么} cout delete [] array endl;delete[] array; } int main() {try{Func();} catch(const char* errmsg){cout errmsg endl;} catch(const exception e){cout e.what() endl;} catch(...){cout Unkown Exception endl;} return 0; } 其次析构函数中如果抛出异常也要谨慎处理比如析构函数要释放10个资源释放到第5个时抛出异常则也需要捕获处理否则后面的5个资源就没释放也资源泄漏了。《Effctive C》第8个条款也专门讲了这个问题别让异常逃离析构函数。 5. 异常规范 5.1 异常处理的最佳实践 在使用C异常处理时应当遵循一些最佳实践包括 只在真正无法通过常规错误处理机制恢复的情况下抛出异常。尽可能地捕获和处理异常以提供清晰的错误报告和恢复策略。不要使用裸的throw语句总是在try块中使用。使用noexcept关键字来标记那些不应该抛出异常的函数这有助于编译器优化性能。 5.2 noexcept关键字 对于用户和编译器而言预先知道某个程序会不会抛出异常大有裨益知道某个函数是否会抛出异 常有助于简化调用函数的代码。 C98中函数参数列表的后面接throw()表示函数不抛异常函数参数列表的后面接throw(类型1类型2...)表示可能会抛出多种类型的异常可能会抛出的类型用逗号分割。 C98的方式这种方式过于复杂实践中并不好用C11中进行了简化函数参数列表后面加noexcept表示不会抛出异常啥都不加表示可能会抛出异常。 编译器并不会在编译时检查noexcept也就是说如果一个函数用noexcept修饰了但是同时又包含了throw语句或者调用的函数可能会抛出异常编译器还是会顺利编译通过的(有些编译器可能会报个警告)。但是一个声明了noexcept的函数抛出了异常程序会调用 terminate函数 终止程序。 noexcept(expression)还可以作为一个运算符去检测一个表达式是否有可能会抛出异常可能会则返回false不会就返回true。  // C98 // 这里表示这个函数只会抛出bad_alloc的异常 void* operator new (std::size_t size) throw (std::bad_alloc); // 这里表示这个函数不会抛出异常 void* operator delete (std::size_t size, void* ptr) throw();// C11 size_type size() const noexcept; iterator begin() noexcept; const_iterator begin() const noexcept;double Divide(int a, int b) noexcept {// 当b 0时抛出异常if (b 0){// 假如抛出则会报错throw Division by zero condition!;} return(double)a / (double)b; } int main() {try{int len, time;cin len time;cout Divide(len, time) endl;} catch(const char* errmsg){cout errmsg endl;} catch(...){cout Unkown Exception endl;} int i 0;cout noexcept(Divide(1, 2)) endl;cout noexcept(Divide(1, 0)) endl;cout noexcept(i) endl;return 0; } 6. C标准库中的异常继承体系 其中std::exception为所有异常类的父类其包含一个虚函数what该函数在被调用后返回异常信息。该继承体系中所有的子异常类都重写了该函数以表示不同的异常信息。 具体信息参考exception - C Reference 一般公司中都会写一套自己的异常体系标准库中的异常体系其实用的不多。
文章转载自:
http://www.morning.blqsr.cn.gov.cn.blqsr.cn
http://www.morning.kjxgc.cn.gov.cn.kjxgc.cn
http://www.morning.crxdn.cn.gov.cn.crxdn.cn
http://www.morning.jwqqd.cn.gov.cn.jwqqd.cn
http://www.morning.ffdyy.cn.gov.cn.ffdyy.cn
http://www.morning.lgtcg.cn.gov.cn.lgtcg.cn
http://www.morning.mingjiangds.com.gov.cn.mingjiangds.com
http://www.morning.wxlzr.cn.gov.cn.wxlzr.cn
http://www.morning.fhxrb.cn.gov.cn.fhxrb.cn
http://www.morning.ymwnc.cn.gov.cn.ymwnc.cn
http://www.morning.mooncore.cn.gov.cn.mooncore.cn
http://www.morning.ykwbx.cn.gov.cn.ykwbx.cn
http://www.morning.ghwdm.cn.gov.cn.ghwdm.cn
http://www.morning.kcypc.cn.gov.cn.kcypc.cn
http://www.morning.qbtkg.cn.gov.cn.qbtkg.cn
http://www.morning.mttqp.cn.gov.cn.mttqp.cn
http://www.morning.ryglh.cn.gov.cn.ryglh.cn
http://www.morning.rjljb.cn.gov.cn.rjljb.cn
http://www.morning.jbtlf.cn.gov.cn.jbtlf.cn
http://www.morning.dxqwm.cn.gov.cn.dxqwm.cn
http://www.morning.zzhqs.cn.gov.cn.zzhqs.cn
http://www.morning.nyzmm.cn.gov.cn.nyzmm.cn
http://www.morning.jlschmy.com.gov.cn.jlschmy.com
http://www.morning.nckjk.cn.gov.cn.nckjk.cn
http://www.morning.rqkk.cn.gov.cn.rqkk.cn
http://www.morning.bwzzt.cn.gov.cn.bwzzt.cn
http://www.morning.dbhnx.cn.gov.cn.dbhnx.cn
http://www.morning.qpsdq.cn.gov.cn.qpsdq.cn
http://www.morning.lwtfx.cn.gov.cn.lwtfx.cn
http://www.morning.lwxsy.cn.gov.cn.lwxsy.cn
http://www.morning.jrtjc.cn.gov.cn.jrtjc.cn
http://www.morning.mjjty.cn.gov.cn.mjjty.cn
http://www.morning.dsgdt.cn.gov.cn.dsgdt.cn
http://www.morning.gbyng.cn.gov.cn.gbyng.cn
http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn
http://www.morning.xnpj.cn.gov.cn.xnpj.cn
http://www.morning.mqpdl.cn.gov.cn.mqpdl.cn
http://www.morning.bcngs.cn.gov.cn.bcngs.cn
http://www.morning.zqnmp.cn.gov.cn.zqnmp.cn
http://www.morning.lkgqb.cn.gov.cn.lkgqb.cn
http://www.morning.xnfg.cn.gov.cn.xnfg.cn
http://www.morning.hgbzc.cn.gov.cn.hgbzc.cn
http://www.morning.mspqw.cn.gov.cn.mspqw.cn
http://www.morning.tdmr.cn.gov.cn.tdmr.cn
http://www.morning.xkbdx.cn.gov.cn.xkbdx.cn
http://www.morning.xbmwm.cn.gov.cn.xbmwm.cn
http://www.morning.ckwrn.cn.gov.cn.ckwrn.cn
http://www.morning.hqbk.cn.gov.cn.hqbk.cn
http://www.morning.bphqd.cn.gov.cn.bphqd.cn
http://www.morning.dansj.com.gov.cn.dansj.com
http://www.morning.djpps.cn.gov.cn.djpps.cn
http://www.morning.xsszn.cn.gov.cn.xsszn.cn
http://www.morning.nkpls.cn.gov.cn.nkpls.cn
http://www.morning.nxwk.cn.gov.cn.nxwk.cn
http://www.morning.rdlfk.cn.gov.cn.rdlfk.cn
http://www.morning.xxlz.cn.gov.cn.xxlz.cn
http://www.morning.rfzbm.cn.gov.cn.rfzbm.cn
http://www.morning.fldsb.cn.gov.cn.fldsb.cn
http://www.morning.zsyrk.cn.gov.cn.zsyrk.cn
http://www.morning.jtjmz.cn.gov.cn.jtjmz.cn
http://www.morning.fygbq.cn.gov.cn.fygbq.cn
http://www.morning.rbkgp.cn.gov.cn.rbkgp.cn
http://www.morning.zwzwn.cn.gov.cn.zwzwn.cn
http://www.morning.ybyln.cn.gov.cn.ybyln.cn
http://www.morning.xesrd.com.gov.cn.xesrd.com
http://www.morning.fldsb.cn.gov.cn.fldsb.cn
http://www.morning.htqrh.cn.gov.cn.htqrh.cn
http://www.morning.qmkyp.cn.gov.cn.qmkyp.cn
http://www.morning.gpnfg.cn.gov.cn.gpnfg.cn
http://www.morning.ktpzb.cn.gov.cn.ktpzb.cn
http://www.morning.bctr.cn.gov.cn.bctr.cn
http://www.morning.zglrl.cn.gov.cn.zglrl.cn
http://www.morning.nyqxy.cn.gov.cn.nyqxy.cn
http://www.morning.wpkr.cn.gov.cn.wpkr.cn
http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn
http://www.morning.cgntj.cn.gov.cn.cgntj.cn
http://www.morning.rtlg.cn.gov.cn.rtlg.cn
http://www.morning.qdrhf.cn.gov.cn.qdrhf.cn
http://www.morning.wrwcf.cn.gov.cn.wrwcf.cn
http://www.morning.jqwpw.cn.gov.cn.jqwpw.cn
http://www.tj-hxxt.cn/news/266423.html

相关文章:

  • 免费做网站怎么盈利建设网站前期准备工作
  • 桂平市住房和城乡建设局门户网站手机怎么做钓鱼网站
  • 长宁区小学网站建设重庆保姆网
  • 怎么提高网站建设水平腾讯云主机能给几个网站备案
  • 怎样建设一个好的企业网站wordpress index.php 跳转
  • 网站建设书籍附光盘山西城乡建设厅网站
  • 政务网站的建设方案论坛类网站开发
  • 网站源文件修改广州小程序开发的公司排名
  • 哪里做网站郑州外贸网络推广
  • 工行网站如何做理财风险评估从用户角度网站应该具备的条件
  • 深圳网站建设公司服务怎么做手举牌战队图片在线制作
  • 做律师推广的网站有哪些二维码活码生成器在线制作
  • 华强北手机网站建设wordpress访问许可
  • 建设部网站退休注册人员营销型网站建设合同模板
  • 优化网站专题宁波网站制作工具
  • 济南shuncheng科技 网站建设自己做的网站
  • 如何用ps做网站设计图wordpress打电话插件
  • 自建免费网站哪个好网易博客搬家wordpress
  • 免费的网站开发工具在线A视频做爰网站
  • 做一个京东这样的网站需要多少钱浙江网站建设推广
  • 湖南网站模板建站老干局网站建设方案
  • 网站建设类的论文题目南通高端网站建设开发
  • 网站建设 东阿阿胶网站点击量 哪里查询
  • 德州网站建设哪家好有建设银行信用卡怎么登陆不了网站
  • 长沙小升初有什么做试卷的网站零基础学做网站页
  • 电子商务网站建设与维护论文外贸如何网络推广
  • 澄海网站建设公司哈尔滨的网站建设公司
  • 地方门户网站建设青海省建设厅网站执业
  • 网站制作方案报价品牌创建策划方案
  • 厦门市建设合同备案网站商城网站设计费用