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

中铁集团网站建设营销技巧和营销方法培训

中铁集团网站建设,营销技巧和营销方法培训,淘宝购物网站的建设,代做电大网站ui作业在写DAServer的过程中,一直在重视报文逻辑处理,却没有认认真真地去思考异常处理的问题。曾经我发现我在所有的报文处理函数中均没有考虑报文长度的问题,让我内心不由地捏了一把冷汗。我在新增的故障录波及故障报告的目录报文中引入了报文长度…

在写DAServer的过程中,一直在重视报文逻辑处理,却没有认认真真地去思考异常处理的问题。曾经我发现我在所有的报文处理函数中均没有考虑报文长度的问题,让我内心不由地捏了一把冷汗。我在新增的故障录波及故障报告的目录报文中引入了报文长度检查,但是其他的类型报文我还是没有克服懒惰情绪,报文类型实在是太多了……

  我想,既然没有检查报文长度,那就把C++可能的异常Catch住就行了,等出了问题再处理吧。我在带领别人编程的过程中一直都在强调:无论如何也不能保证自己不出错,但是一定要保证把系统所有可能出错的地方Catch住,保证系统即使出现问题也不能影响其他功能使用。

  不知道怎么回事,我研究C++异常处理这个重要问题的时候,却没有深入研究,以至于得到一个错误的结论是:C++只能catch显式throw出来的异常。虽然我的直觉上是表示怀疑的,但是我怎么就没有去深入研究一下呢?比如我在VS2008上新建一个默认的C++ Console工程,测试如下代码:

复制代码
#include <iostream>
using namespace std;int main(int argc, char **argv)
{try    {throw 1;}catch(...){cout << "exception!" << endl;}system("pause");return 0;
}
复制代码

  这个一点问题都没有,显式throw一个异常,然后catch(...)来捕获所有类型的异常。但是如果测试这样的代码呢:

复制代码
#include <iostream>
using namespace std;int main(int argc, char **argv)
{try    {int* p = (int*)0x12345678;*p = 123;}catch(...){cout << "exception!" << endl;}system("pause");return 0;
}
复制代码

  这时将会弹出如下对话框:

   这种错误正是我希望能够捕获的,在内存访问越界、非法操作等情况下都会出现,而且我的DAServer出现异常90%都是这个错误。怎么办?今天仔细搜索了一下,我才找到问题的处理办法:

   在“启用C++异常”选项中选择“是,但有SEH异常(/EHa)”即可。

  什么是SEH异常呢?请参见文章《深入解析结构化异常处理(SEH)》。简要来说是这样的:

概念:

C++异常”就是 try{}catch(...){}
SEH异常”就是 __try{} __except(-1/0/1){}
(关于这两种异常,如有不了解的地方,网上有很多资料可以参考)

目前微软所有的VC编译器(从VC6到VC2010),都默认是打开对C++异常的编译支持的(位于项目选项中的“代码生成”->启用C++异常:/EHsc,VC6是Enable Exception handling)

(以下需要仔细阅读)
  在VC6中,对EXE工程是同时默认开启“C++异常可以捕获SEH异常”。在此条件下,用“C++异常”也可以捕获向非法地址的读写等基本的Windows异常。


  如:try{ int *a=0; *a=100; }catch(...){printf("excption!");},执行到*a=100时,会跳转到catch块,并执行printf。
  但是,VC6建立的DLL或其他非EXE工程,如果是Release模式,并且编译时,启用了代码自动优化,那么结果就变成了只启用了“C++异常”,即“C++异常无法捕获SEH异常”。这样的一个后果是,在DLL中,即使像这样用try{ int *a=0; *a=100; }catch(...){printf("excption!");}保护代码,当代码执行到*a=100非法地址赋值语句时,catch(...)却什么都捕获不到,会直接造成程序崩溃。
  除非明确使用“SEH异常”__try...__except(1)..,才能捕获到这种Windows异常。


相应的解决办法:
  对于从VC7开始以及以后的VC++,在“代码生成”->“启用C++异常”处,均有第三个选项:“有效,但有SEH异常(/EHa)”,这样就是可以让程序“使用C++异常也能够捕获到SEH异常”。这样无论是在EXE还是DLL中,try{}catch(...){}同样可以捕获Windows异常。


  对于VC6的非EXE工程,有以下两个方法,来用try..catch..捕获Windows的SEH异常:
1、通过关闭编译时的优化(禁用或者只使用Default级别,个人感觉是因为VC6的编译器不是非常完善)。
2、通过在当前工程的编译选项中,手工加上 /EHa 参数。这个编译选项是没有界面可以去设置的,只能手工添加。
  这两个方法选择任何一个都可以。建议使用第二个方法。另外要注意“C++异常”与“SEH异常”无法同时在同一个函数中混用。


From:http://www.cnblogs.com/kuliuheng/p/4784891.html


http://www.lbrq.cn/news/2669617.html

相关文章:

  • dz网站收款即时到账怎么做的宁波seo软件
  • 河南建筑公司网站开鲁seo服务
  • 化妆品网站建设推广方案百度助手
  • 中国建设银行湖北省分行网站整站优化是什么意思
  • wordpress是否可以排版杭州seo代理公司
  • 海南网站优化百度手机助手免费下载
  • 兰州seo安安网站建设浙江seo外包费用
  • 深圳专业做网站服务网络营销成功案例有哪些
  • 浏览器正能量网站免费软件网店运营
  • 众创空间网站建设方案互联网登录的网站名
  • 青岛网站建设康之迅b站是哪个网站
  • 请别人做网站有风险吗全网seo优化电话
  • wordpress 社交插件襄阳网站seo
  • 河北住房和城乡建设网站国内最新的新闻
  • 网站首页动画效果太原seo快速排名怎么样
  • wordpress4.8.2优化分析
  • wordpress电话修改seo怎么发布外链
  • dede title 我的网站投放广告的渠道有哪些
  • 茶企业网站优化大师如何删掉多余的学生
  • 廊坊制作网站公司原画培训机构哪里好
  • 中企动力做的网站怎么样宁波seo入门教程
  • 深圳公司做年报网站搜索引擎优化方法总结
  • 代理加盟网站建设公司seo网站关键词排名提升
  • wordpress好玩的主题北京网站优化对策
  • pc网站建设哪个好合肥网站建设程序
  • 大庆市城乡建设局网站青海seo技术培训
  • 网站建设的好处打开免费百度啊
  • 物流网站风格外链发布论坛
  • 做cpa广告网站教程网站开发培训
  • 自助建站程序宁波seo整站优化软件
  • Linux环境下实现简单TCP通信(c)
  • 代码随想录算法训练营第六十天|图论part10
  • Kafka消费者相关原理
  • vuhub drippingblues靶场攻略
  • 锂电池SOH预测 | 第35讲 Matlab基于BiLSTM的锂电池健康状态估计(锂电池SOH预测),附锂电池最新文章汇集
  • 【linux基础】Linux命令提示符解析与操作指南