文/徐瑱
徐瑱,2013年初步涉及云计算行业。并出任首席架构师的职位,熟悉Java、C#、C/C++等开发语⾔,做过超过10个以上的⼤型项目分析、设计经验。目前,服务于是上海新致云产品研发,负责新致云的架构设计,以及运维服务。并负责新致云技术机构及基础技术平台建设。
新致云是目前云服务行业内少有的为客户同时提供IaaS、PaaS、SaaS服务的云服务提供商,具备多年云计算开发经验的资深程序猿,我们也会经常就项目开发中所遇到的问题进行讨论,在此与各位IT大牛们一起分享我们日常开发中所总结的经验。
众所周知,对于判错处理的设计,传统的设计思路是设计检查代码。而在现代程序设计中,同时也提供了异常处理机制。但是如何合理恰当地选择反而成为了程序设计者所困扰的一个问题,特别在性能敏感的场合,更是分歧严重。
我就试图就这个问题展开一些讨论
使用检查机制来处理各种错误情况的方法,不难发现其开销是非常轻量的,并且在代码的复杂度上,与异常处理并没有太大差别。而异常机制,相对较为复杂。下面我们就选择Java语言来看下异常机制的一些特征。
提起异常的特征,第一感觉就是非常昂贵。为什么呢?因为我们需要捕获异常堆栈的当前状态。而且这还不是开销的所有,只是个开头。还有一些其他的特征,包括 可以创建、可以被捕获、表示为第一级对象、继承深度3级以上等等。异常对象与正常对象最大的区别,就是它们可以被抛出和捕获。
接下来我们看下处理异常的流程
JVM通过抛出athrow指令来抛出异常。该指令会使得JVM将异常对象弹出异常堆栈,然后JVM通过搜索当前执行堆栈帧来得到第一个Catch子句来处理该类或者其超类的一个异常。如果没找到,那么需要释放当前的堆栈帧,在下一个堆栈帧中重新抛出。这样一直到找到包含匹配的Catch子句的堆栈帧,或者到达异常堆栈的底部。如果一直没有找到,所有的堆栈帧都会被释放,线程会在ThreadGroup对象有了被处理异常的机会后被中止。如果找到,则程序计数器被重置到Catch代码的第一行。
从上述可以获知,相对于类型检查,抛出异常的处理实在是非常昂贵的。而且,针对异常的处理,跟普通一级对象并没有特殊区别。我们可以得出一个结论就是异常机制应该为异常的情况保留。在超过函数逻辑本身的特殊情况下,使用异常处理是一个合适的选择。在无异常的情况下,还是通过检查来避免使用异常抛出从而可以得到一个对于较优的选择。
以上是我以Java开发为例所分析的异常机制的一些特征,在日常新致云的项目开发中,经常会遇到一些新鲜有趣的问题,后续会为大家呈现更多在开发中遇到的问题和解决方案。