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

网站开发持续更新卓越建站快车

网站开发持续更新,卓越建站快车,全景网站是怎么做的,东莞网站建设 钢结构前几天做CA签名这个需求时发现一个很诡异的事情#xff0c;CA签名调用的接口是由另外一个开发部门的同事(比较难沟通的那种人)封装并提供到我们这边的。我们这边只需要把数据准备好#xff0c;然后调他封装的接口即可完成签名操作。但在测试过程中#xff0c;发现他提供的接…前几天做CA签名这个需求时发现一个很诡异的事情CA签名调用的接口是由另外一个开发部门的同事(比较难沟通的那种人)封装并提供到我们这边的。我们这边只需要把数据准备好然后调他封装的接口即可完成签名操作。但在测试过程中发现他提供的接口在某些边界条件时会报错。通过反编译调试后把报错的堆栈及要如何修改都发给了那个同事但是他没鸟我项目经理他不懂技术也不想管这个事情(所以以后跳槽一定要跳到一个好一点的团队)。我该做的都已经做了没办法毕竟是我负责的功能需求到时候报错了也是第一时间找到我。我这边就try catch捕获一下异常呗神奇的事情出现了没捕获到而是被Application.ThreadException事件注册的方法给捕获到了(这里捕获这个词不算很恰当即触发Application.ThreadException事件对应的方法)。我们都知道UI线程中未捕获的异常如果在程序的Main方法入口注册了Application.ThreadException事件对应的方法UI线程发生异常如果未捕获并处理该异常就会触发Application.ThreadException事件对应的方法。这就说明我try catch不到他那个接口的异常信息。 我这边处理的业务逻辑代码大概可以描述为 通过反编译看了一下调用封装CA签名接口的代码块对应的代码它的大概处理流程是这样的先通过Spring.Net接口调用CA签名的业务逻辑记为业务逻辑A业务逻辑A的实现流程如下通过反射拿到对应的CA签名的实现类(因为我们这边的代码需要兼容多个CA签名的厂商)我们这边对接的是网政通的CA我这边就只介绍一下它的大概流程先获取提供接口的CA用户的用户信息记为步骤1如果有用户信息则需要再次调用获取用户token信息接口记为步骤2获取token用户信息成功后再调用获取CA用户二维码信息的接口获取到签章并以二维码的形式显示出来让用户进行扫码操作记为步骤3。如果前面的步骤1不成功后面的步骤23都不用继续操作了直接返回CA签名失败走普通签名逻辑。同事的接口报错就发生在步骤1中没有CA用户信息时某些代码逻辑写得不够严谨就报错了。 至于我这边为何try catch步骤1中发生的异常信息我做了如下的猜测并进行了验证 1   是不是spring.net的框架把它给处理了结合前面使用过spring.net的经验排除了这种可能性 2   是不是被反射的方法里面报错调用方就抓不到异常不太确定那就用代码验证一下后面验证过了反射的虽然拿不到具体的报错堆栈信息但还是能通过try catch捕获到异常信息的。 3  是不是他的代码里面有我不知道的异常处理方式但是看了好久也没看出哪里有特别的地方 4  是不是在不同的AppDomain的异常就捕获不到后面也尝试过了也是能捕获的 前面的猜测无果后就一路在网上查询C#中try catch不到异常的情况 网上说的情况(未验证)有说调用非托管的代码就捕获不到异常 其它靠谱一点的捕获不到异常的情况 文章链接1 (未做验证)Exception not caught using catch block StackOverflowException堆栈溢出异常 ThreadAbortedException线程停止异常 OutOfMemoryException堆栈溢出异常 ExcutionEngineException执行引擎异常 BadImageFormatException错误图片类型异常 文章链接2 (未做验证)The Uncatchable Exception 情况1出现死递归导致内存异常的异常 情况2处理的异常中人工调用了Environment.FailFast捕获不到异常程序直接退出 不过都不是我要的解决方案当看到Environment.FailFast时突然灵光一闪是不是winform框架给捕获了然后再手工调用某个方法会触发Application.ThreadException事件对应的方法。有了思路后再来反调试代码发现同事重写了winfrom窗体的OnLoad方法在重新的OnLoad方法中完成步骤1操作而在反编译调试中看到winfrom窗体调用OnLoad方法的调用方捕获了异常并调用Application.OnException触发Application.ThreadException事件对应的方法如下图 下面我们就一起验证一下这种情况 测试环境 .net framework 4.0 visual studio 2017 具体步骤如下 1   新增名为TestMain的winfrom项目 2   编辑默认的Program类如下 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms;namespace TestMain {static class Program{/// summary/// 应用程序的主入口点。/// /summary[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.ThreadException Application_ThreadException;Application.Run(new Form1());}private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e){MessageBox.Show(Main方法中的Application_Thread输出,详细错误信息如下: e.Exception.Message e.Exception.StackTrace);}} }这里我注册了Application.ThreadException事件回调的方法Application_ThreadException如果UI线程中有没有处理的异常就会触发这个方法。 3  新增winform窗体名为QRCodeFrm对应的UI界面设计如下 对应的后台代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace TestMain {public partial class QRCodeFrm : Form{public QRCodeFrm(){InitializeComponent();}protected override void OnLoad(EventArgs e){bool flag true;if (flag){int a 1;int b 0;//这里会抛出异常int c a / b;}}} }在这里我们重写了OnLoad方法然后再进行a/b的除以0操作这里运行时会报异常 4   在默认的Form1窗体中拖入一个按钮UI界面如下图 button1按钮对应的逻辑如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; using TestApi;namespace TestMain {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){try{QRCodeFrm frm new QRCodeFrm();frm.ShowDialog();}catch (Exception ex){MessageBox.Show(捕获到异常,异常信息如下:ex.Messageex.StackTrace);}}} }在button1_Click我们进行捕获异常 5  生成项目并运行结果如下 可以看到Application.ThreadException事件回调的方法Application_ThreadException已经被调用接着后弹出QRCodeFrm对应的窗体如下图 可以看到已经按照猜想那样进行了输出显示。 回到最初的那个问题我们要怎么处理才能捕获到同事接口的那个异常信息呢有个不是很靠谱的方法是我们在合适的地方重新注册Application.ThreadException事件方法我们都知道通过的方式注册的Application.ThreadException事件方法前面已经注册过的事件方法就会被覆盖。修改前面演示的例子中的Form1并编辑如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; using TestApi;namespace TestMain {public partial class Form1 : Form{bool isCatch false;string errorMessage string.Empty;public Form1(){InitializeComponent();Application.ThreadException New_Application_ThreadException;}private void New_Application_ThreadException(object sender, ThreadExceptionEventArgs e){errorMessage e.Exception.Message e.Exception.StackTrace;isCatch true;}private void button1_Click(object sender, EventArgs e){try{QRCodeFrm frm new QRCodeFrm();frm.ShowDialog();}catch (Exception ex){MessageBox.Show(捕获到异常,异常信息如下:ex.Messageex.StackTrace);}if (isCatch){MessageBox.Show(被捕获的异常:errorMessage);}}}}运行结果如下 接着会弹出粗我提示框如下 可以看到Main方法中注册的Application.ThreadException事件方法的已经被新注册的方法给覆盖了 注意这种解决方案风险比较大我这边新增了一个参数进行控制是否进行Application.ThreadException事件方法的重新注册等同事修改了代码我这边就会把参数进行关闭这算是留了一手吧 本文的内容到此结束内容仅代表个人观点如有写得不对的地方望指正。
http://www.pierceye.com/news/672507/

相关文章:

  • 怎么让别人看到自己做的网站地信的网站建设
  • 网站主体注销泰安新闻视频在线
  • 怀柔网站建设优化seo瓯北网站制作公司
  • 福田住房和建设局网站官网做自己点击网站
  • 临沂市建设局网站简介佛山建网站
  • 哪种类型的网站比较难做阿里云宝塔安装wordpress
  • 购物网站起名网站建设皿金手指排名
  • 河北省住房和城市建设厅网站怎么做cpa网站
  • 网站备案 取名资讯通不过软文投放平台有哪些?
  • 民治做网站多少钱好看的企业网站首页
  • 腾讯域名怎么建设网站客户管理系统免费
  • 承德网站建设报价网站建设中企动力最佳a5
  • 图书馆第一代网站建设海口会计报名网站
  • 网站设计师简介中国工厂网站官方网站
  • 广州移动 网站建设十大职业资格培训机构
  • 网站建设维护协议书网站开发程序用什么好
  • 零基础做网站教程天猫商城商品来源
  • 广州知名网站建设公司教育机构培训
  • 做游戏解说上传在什么网站好企业网站定制
  • 用iis浏览网站南宁网站seo大概多少钱
  • 如何用手机网站做淘宝客wordpress 免费 旅游
  • 青岛网站建设网站制作seo顾问服务福建
  • phpcms网站织梦 网站栏目管理 很慢
  • 金融网站 改版方案seo推广优化培训
  • 博物馆设计网站推荐网站布局有哪些常见的
  • 外贸网站建设980ps软件需要付费吗
  • 网站开发后的经验总结北新泾街道网站建设
  • 深圳市南山区住房和建设局网站国内知名网站建设伺
  • 企业网站建设制作的域名费用做的网站怎么上传
  • c++可视化界面设计搜索引擎优化自然排名的区别