`
yunzhongxia
  • 浏览: 639941 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flex异常处理设计

    博客分类:
  • flex
阅读更多

      Flex与服务器交互一般需要监听ResultEvent.RESULT事件和FaultEvent.FAULT事件。很多时候关注的是RESULT事件,FAULT事件在出现异常的情况下显得很有用。FAULT事件分为客户端和服务器端两大类。

      下图是一个客户端的错误信息,代码如下:

      

private function onFault(event:FaultEvent):void{
            Alert.show(event.toString());
}

       

    

   从弹出的信息中可以看出是因为amf的url地址不对造成的。

   下面来分析下FaultEvent对象。

    FaultEvent对象的一个重要属性就是fault,Fault 类表示远程过程调用 (RPC) 服务调用中存在错误。

    Fault的常用属性如下表:

   

 

      下面是服务器端的异常信息。

      

 

     与客户端异常信息对比可以发现:客户端的faultCode以Client开头,服务器端的faultCode以Server开头。

     在java端可能用的比较多的异常处理类似于:new Exception("用户ID不能为空");这些异常是受检验的异常,用户很容易知道该如何办,但是如果抛出一个运行时异常,例如:java.lang.NullPointerException。用户就傻了,我改如何处理呢?是我操作有误还是系统出现问题了。业务用户现在能做的就是在bug系统上报一个bug。

     一个好的异常处理架构应遵循以下规则:

    1 任何异常都不会导致应用系统的崩溃。
    2 在发生异常时,允许应用程序进行相应的处理。
    3 显示给用户的错误信息要清晰的描述发生了什么错误以及应该采取什么样的处理。
    4 如果需要辅助信息,错误信息还要帮助用户与帮助部门交互,为帮助部门团队提供必要的信息, 使他们能够快速的容易的重现错误。
    5 日志信息能为开发团队人员在识别错误、在应用程序代码中定位错误产生的位置以及修正错误提供必要的信息。
    6 错误处理代码不会降低应用程序代码的可读性。我们经常在网上查询oracle错误代码的处理方法。    

 

   在来回顾下,Fault对象的faultCode、faultDetail、faultString、rootCause。可以根据错误代码(faultCode)让用户做不同的处理,当然系统也可以记录下一些重要的异常信息作为系统优化的依据,文本说明(faultString)表示那个字段不能为空等提示信息,详细错误信息(faultDetail)可以知道错误更详细的信息,那个类的那个方法发生了什么异常。堆栈信息(rootCause)可以让我们更加清晰的看到错误的堆栈信息。

   下面是一个很常用的异常信息提示框,点击详细信息的时候,开发人员可以很容易的定位异常。

  

 

 

    我们知道了客户端Fault对象的数据结构后,就需要知道java端如何将java.lang.Exception转化为Fault的。以下主要说的是blazeds。

    flex.messaging.MessageException继承自LocalizedException,LocalizedException继承自RuntimeException。

   

    

public class LocalizedException extends RuntimeException
{
    /** @exclude - transient, the resourceLoader for localized strings doesn't need to serialize.  */
    protected transient ResourceLoader resourceLoader;
    /** @exclude */
    protected int number;
    /** @exclude */
    protected String message;
    /** @exclude */
    protected String details;
    /** @exclude */
    protected Throwable rootCause;

}

 

 

  可以很清晰的看到message对应Fault对象的faultString,details对应Fault对象的faultDetail,rootCause对应Fault对象的rootCause,number和Fault对象的code的对应还需要ResourceLoader从blazeds的errors.properties文件中加载相应的错误代码信息。例如:

 

10000=There was an unhandled failure on the server. {0}
10001=Null endpoint id arrived on message.
10002=No such endpoint: {0}
10003=No configured channel has an endpoint path ''{0}''.
10004=No destination with id ''{0}'' is registered with any service.
10005=Destination ''{0}'' not accessible over channel ''{1}''.
10006=Error occurred while attempting to convert an input argument''s type.
10007=Cannot invoke method ''{0}''.
10007-0-details=Method ''{0}'' not found.
10007-1-details={0} arguments were sent but {1} were expected.
10007-2-details=The expected argument types are ({0}) but the supplied types were ({1}) and converted to ({2}).
10007-3-details=The expected argument types are ({0}) but the supplied types were ({1}) with none successfully converted.
10007-4-details=The expected argument types are ({0}) but no arguments were provided.
10007-5-details=No arguments were expected but the following types were supplied ({0}).
10008=Cannot create class of type ''{0}''.
10008-0-details=Type ''{0}'' not found.

 

 

 将整个系统的异常进行分类是一个很难的事情,优秀的异常分类能让我们快速的定位错误发生的位置,该如何处理。

 如果系统中用到了spring那么很容易的用ApplicationContext加载资源文件,从资源文件中获得相应code的值。

 

 知道了以上的知识后,我们就可以很容易的实现flex的异常处理了,new出一个MessageException,设置messageException的各个属性就可以了。简单的代码如下;

 

MessageException flex=new MessageException();
flex.setCode("错误代码");
flex.setMessage("我的测试数据");
flex.setDetails("详细信息");
flex.setRootCause(flex.getCause());
throw flex;

 

如果你的系统用到了SPRING BLAZEDS INTEGRATION,那么请继续往下看。

我们的系统中也许有自己的异常处理类,不想每次抛出异常都是flex的MessageException,如果有一个转化器将会大大降低j2ee与blazeds的耦合度。

其实在SPRING BLAZEDS INTEGRATION中我们很容易实现异常信息转化。

配置如下:

<bean id="sdpExceptionTranslator" class="org.sdp.flex.SdpExceptionTranslator"/>
    <flex:message-broker id="_messageBroker"
		services-config-path="/WEB-INF/flex/services-config.xml">
		<!-- 异常转化类  -->
		<flex:exception-translator ref="sdpExceptionTranslator" />
	</flex:message-broker>

 exception-translator 属性定义了异常转化类的bean。该java只需要实现ExceptionTranslator 接口就可以了。handles方法判断要拦截的异常类,translate方法负责将一个java异常转化为blazeds异常。

 

 

public class SdpExceptionTranslator implements ExceptionTranslator {

	 /**
     * 
     * {@inheritDoc}
     */
    public boolean handles(Class<?> clazz) {
    	//判断要拦截的exception类型
        return ClassUtils.isAssignable(SdpException.class, clazz);
    }

    /**
     * 
     * {@inheritDoc}
     */
    public MessageException translate(Throwable t) {
        if (t instanceof SdpException) {
        	SdpException sdp=(SdpException) t;
            MessageException se = new MessageException();
            se.setCode(""+sdp.getNumber());
            se.setMessage(sdp.getMessage());
            se.setDetails(sdp.getDetails());
            se.setRootCause(t);
            return se;
        }
        return null;
    }

}

 

 

 

   限于时间限制,flex异常就先写到这里,有什么疑问可以给我留言。以后我会将自己的flex4+blazeds4+SPRING BLAZEDS INTEGRATION1.5+spring开发平台贡献出来,当然里面有更加详细的异常处理方法了,请大家多多关注我的博客。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 23.7 KB
  • 大小: 32.7 KB
  • 大小: 16.8 KB
  • 大小: 16.1 KB
6
1
分享到:
评论
9 楼 juedi 2015-01-08  
很好,是我需要的东东
8 楼 houyongbo03 2012-08-03  
请问如何获取 distnation,method,param 等信息
7 楼 bravowell 2011-07-20  
yunzhongxia 写道
bravowell 写道
问下你flex里面的提示框代码怎么写的,

自定义一个titlewindow就可以了

我是 想问如何拿到 distnation,method,param 等信息
6 楼 bravowell 2011-07-20  
flex怎么拿不到堆栈信息 ?
5 楼 yunzhongxia 2011-07-20  
bravowell 写道
问下你flex里面的提示框代码怎么写的,

自定义一个titlewindow就可以了
4 楼 bravowell 2011-07-20  
问下你flex里面的提示框代码怎么写的,
3 楼 bravowell 2011-07-19  
yunzhongxia 写道
bravowell 写道
正好用到这块 ,能发你的开发平台吗? bravowell@qq.com 谢谢。

谢谢你的关注,目前还不能与大家一起共享,以后会开源的。

:)碰到问题在咨询你
2 楼 yunzhongxia 2011-07-19  
bravowell 写道
正好用到这块 ,能发你的开发平台吗? bravowell@qq.com 谢谢。

谢谢你的关注,目前还不能与大家一起共享,以后会开源的。
1 楼 bravowell 2011-07-19  
正好用到这块 ,能发你的开发平台吗? bravowell@qq.com 谢谢。

相关推荐

    Flex新手教程_入门级学习笔记

    2.6异常和错误处理 13 3.Flex组件 15 3.1布局设计 15 3.3 MXML Module模块应用 16 3.4 表单 16 3.5 对话框 17 3.6 列表 18 3.7弹出菜单 19 3.8复杂用户交互应用结构 21 3.8.1 Tree高级应用 21 3.8.2 DataGrid 22 3.9...

    Java语言程序设计 基础篇梁勇part5-5

    基础篇主要介绍基本程序设计、语法结构、面向对象程序设计、继承和多态、异常处理和文本I/O、抽象类和接口等内容。 本书可作为高等院校相关专业程序设计课程的基础教材,也可作为Java语言及编程爱好者的参考资料

    Flash ActionScript 3.0学习指南

    全书内容包括ActionScript 3.0 语言介绍、ActionScript3.0基本语法、事件机制、面向对象、数组、正则表达式、XML应用、常用的内置类、基本组件、...DataGrid组件、文本处理、绘图、几何结构、音频、视频、网络、异常处理...

    openapi-bundle:帮助您根据OpenAPI规范创建REST API

    异常处理。 安装 使用Symfony Flex的应用程序 打开命令控制台,输入项目目录并执行: composer require nijens/openapi-bundle 不使用Symfony Flex的应用程序 步骤1:下载套件 打开命令控制台,输入项目目录并执行...

    ActionScript开发技术大全

    第8章ActionScript3.0异常处理 150 8.1ActionScript3.0异常 150 8.1.1异常概述 150 8.1.2异常分类 150 8.2ActionScript3.0调试方法 152 8.2.1FlashPlayer的调试版本 152 8.2.2在FlashCS3IDE中调试 152 8.2.3在Flex...

    ActionScript开发人员指南中文版

    响应未捕获的JavaScript异常 使用JavaScript处理运行时事件 第章:在移动应用程序中显示HTML内容 StageWebView对象 内容 导航事件 历史记录 焦点 位图捕获 第章:安全性 FlashPlatform安全概述 安全沙箱 权限控制 限制...

    asp.net知识库

    利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文...

    Altium Designer Beta 19.0.10完整版安装包+安装教程+和谐文件

    修复了刚度Flex设计在等轴测视图和具有真几何的Board装配视图中显示不正确的问题。 22669 改进了Dimension对象点的捕捉行为。 24616 修复了(特定用户的设计)导出到PDF (BC:9184)后出现“绘图员文档已过期”的...

    第三代移动WEB内核小程序风口-逐浪CMS2 x3.9.3全面发布

    ■基于FLex弹性布局重写前端(OA平台因要支持传统业务暂不涉及)。 ■提供全新的Bootstrap 4.0技术文档,并获得Bootstrap官方认同,访问http://code.z01.com/v4 ■前后端全面引入scss(sass)技术,与Bootstrap官方...

    Spring攻略(第二版 中文高清版).part2

    8.8 映射异常视图 312 8.8.1 问题 312 8.8.2 解决方案 312 8.8.3 工作原理 312 8.9 用@Value在控制器中赋值 314 8.9.1 问题 314 8.9.2 解决方案 314 8.9.3 工作原理 314 8.10 用控制器处理表单 ...

    Spring攻略(第二版 中文高清版).part1

    8.8 映射异常视图 312 8.8.1 问题 312 8.8.2 解决方案 312 8.8.3 工作原理 312 8.9 用@Value在控制器中赋值 314 8.9.1 问题 314 8.9.2 解决方案 314 8.9.3 工作原理 314 8.10 用控制器处理表单 ...

    基于j2ee的ajax宝典

    1.2 重新设计Web应用····· 5 1.2.1 RIA应用·········· 5 1.2.2 异步发送请求并避免等待···················· 7 1.2.3 使用Ajax·········· 7 1.3 Ajax简介··· 8 ...

Global site tag (gtag.js) - Google Analytics