- 浏览: 2470221 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
目前在处理返回值方面, 有两种代码风格:
一种是这样:
另一种是:
但是我推荐采用第二种方式, 理由主要有三个方面:
1. 从重构的角度来说, 如果一个方法中有多个return出口, 当方法膨胀之后需要将一块代码抽取出来单独形成一个方法的时候比较困难, 而采用异常的方式则可以很容易的抽取出单独方法.
2. 从代码重用的角度来说, 第一种如果method1, method2方法有多个地方调用, 这些需要调用的地方大部分情况下都要对结果进行判断加错误码并返回结果, 这个是重复的代码, 这样重复性代码在ic中是随处可见的, 我希望通过抛错误码异常的方式来减少这种重复的东西.
3. 从封装的角度来说, 将非正常结果的处理封装在方法的内部, 可以提高内聚性.
这样做的两个缺点:
1. 必须将method1, method2套在一个try...catch中, 然后将ErrorCodeException转换成result.
2. 还有一些方法的确需要根据情况自己处理返回值的, 不希望抛出异常, 你必须提供一个不抛出异常的方法
3. 在性能上, 因为需要使用到异常堆栈, 这个会有一定的性能损失, 如果是分布式应用的话, 尽量改错误码, 而不是异常, 因为异常比简单的错误码方式序列化的成本会更高
我采用第二种方式是来自于对这样的语句变体: 有些方法在开始处都会对参数进行检查的卫语句, 比如非空, 非0检查, 如果参数不合格抛出IllegalArgumentException(如果不是因为要返回错误码, 完全可以抛出IllegalArgumentException).
应该在抛出指定异常(比如PowerUserException)的具体地方直接返回包装了错误码的ErrorCodeException, 然后在最外层捕获ErrorCodeException, 然后转换成result
一种是这样:
result = method1(); if (result is error){ //根据返回结果判断是否退出 ...//加错误码 return result; } result = method2(); if (result is error){ //根据返回结果判断是否退出 ...//加错误码 return result; } do something...
另一种是:
try{ method1() // 如果有逻辑问题抛出ErrorCodeException method2() // 如果有逻辑问题抛出ErrorCodeException do something... }catch(ErrorCodeException e){ // 将ErrorCodeException异常转换为Result return result; }
但是我推荐采用第二种方式, 理由主要有三个方面:
1. 从重构的角度来说, 如果一个方法中有多个return出口, 当方法膨胀之后需要将一块代码抽取出来单独形成一个方法的时候比较困难, 而采用异常的方式则可以很容易的抽取出单独方法.
2. 从代码重用的角度来说, 第一种如果method1, method2方法有多个地方调用, 这些需要调用的地方大部分情况下都要对结果进行判断加错误码并返回结果, 这个是重复的代码, 这样重复性代码在ic中是随处可见的, 我希望通过抛错误码异常的方式来减少这种重复的东西.
3. 从封装的角度来说, 将非正常结果的处理封装在方法的内部, 可以提高内聚性.
这样做的两个缺点:
1. 必须将method1, method2套在一个try...catch中, 然后将ErrorCodeException转换成result.
2. 还有一些方法的确需要根据情况自己处理返回值的, 不希望抛出异常, 你必须提供一个不抛出异常的方法
3. 在性能上, 因为需要使用到异常堆栈, 这个会有一定的性能损失, 如果是分布式应用的话, 尽量改错误码, 而不是异常, 因为异常比简单的错误码方式序列化的成本会更高
我采用第二种方式是来自于对这样的语句变体: 有些方法在开始处都会对参数进行检查的卫语句, 比如非空, 非0检查, 如果参数不合格抛出IllegalArgumentException(如果不是因为要返回错误码, 完全可以抛出IllegalArgumentException).
评论
3 楼
macrochen
2010-07-23
flysnowxf 写道
我们项目的rest层也使用了第二种方法。但这样catch的代码非常地多,也都是重复的,不知道有什么好的解决方式吗?如果在groovy中,用闭包就可以很优雅地解决了。
try { // 业务处理 // 包装结果 result.setCode(ResultCode.SUCCESS); } catch (IllegalArgumentException e) { result.setCode(ResultCode.PARAMS_NULL); } catch (VersionException e) { result.setCode(ResultCode.VERSION_NOT_MATCH); } catch (SessionNotExistException e) { result.setCode(ResultCode.SESSION_NOT_EXIST); } catch (SessionException e) { result.setCode(ResultCode.SESSION_EXCEPTION); } catch (UserNotExistException e) { result.setCode(ResultCode.USER_NOT_EXIST); } catch (MessageNotExistException e) { result.setCode(ResultCode.MESSAGE_NOT_EXIST); } catch (PowerUserException e) { result.setCode(ResultCode.POWERUSER_EXCEPTION); } catch (Exception e) { result.setCode(ResultCode.UNKNOWN); }
应该在抛出指定异常(比如PowerUserException)的具体地方直接返回包装了错误码的ErrorCodeException, 然后在最外层捕获ErrorCodeException, 然后转换成result
2 楼
flysnowxf
2010-07-23
我们项目的rest层也使用了第二种方法。但这样catch的代码非常地多,也都是重复的,不知道有什么好的解决方式吗?如果在groovy中,用闭包就可以很优雅地解决了。
try { // 业务处理 // 包装结果 result.setCode(ResultCode.SUCCESS); } catch (IllegalArgumentException e) { result.setCode(ResultCode.PARAMS_NULL); } catch (VersionException e) { result.setCode(ResultCode.VERSION_NOT_MATCH); } catch (SessionNotExistException e) { result.setCode(ResultCode.SESSION_NOT_EXIST); } catch (SessionException e) { result.setCode(ResultCode.SESSION_EXCEPTION); } catch (UserNotExistException e) { result.setCode(ResultCode.USER_NOT_EXIST); } catch (MessageNotExistException e) { result.setCode(ResultCode.MESSAGE_NOT_EXIST); } catch (PowerUserException e) { result.setCode(ResultCode.POWERUSER_EXCEPTION); } catch (Exception e) { result.setCode(ResultCode.UNKNOWN); }
1 楼
thebye85
2010-05-13
发表评论
-
使用Externalization更高效的实现java对象序列化
2012-04-04 22:38 3147Externalization没用过, 它通过牺牲默认序列化的 ... -
关于java的检查异常和非检查异常
2012-04-04 21:31 4969这里有一个关于java的检查异常和非检查异常的观点, 我比较赞 ... -
使用ThreadLocal保证DateFormat线程安全
2012-04-03 06:45 3603大家都知道DateFormat是线程非安全的, 一般在多线程环 ... -
使用枚举实现一个状态机
2012-04-02 23:14 3939非常巧妙的一个使用枚举的例子.原文见这里 interface ... -
一个同步队列例子
2012-04-02 21:35 1572这个用的也比较少, 做一个参考, 原文见这里 private ... -
一个读写锁的例子
2012-04-02 21:20 1532用的比较少, 做一个参考. 原文在这里 public clas ... -
如何计算一个合适的线程池大小参数
2012-04-02 20:57 9071原文在这里 下面是一个计算的框架代码: /** * A ... -
正确使用日志的10个技巧
2012-02-11 21:13 28854做一个苦逼的Java攻城师, 我们除了关心系统的架构这种hig ... -
Java编程最差实践
2012-02-04 17:54 26641原文地址:http://www.odi.ch/prog/des ... -
利用jOOR简化Java 反射使用
2012-01-15 20:39 5158原文:http://lukaseder.wordpress.c ... -
《Java Performance》书评
2012-01-15 18:32 2963原文: http://java.dzone.com/rev ... -
《细说Java》读书笔记
2011-10-05 15:01 1994国人写的, 感觉是一 ... -
《Java开发超级工具集》读书笔记
2011-09-28 08:59 2100"工欲善其事必先利其器", 在平时的开发 ... -
《effective java》 读书笔记
2011-07-02 14:52 7603读第一版已经是好几年前的事儿了, 现在想起来也没什么印象, ... -
用java实现"awk -d"功能(保留多行重复)
2010-06-07 21:48 3073一般用过linux脚本的都知道"awk -d&quo ... -
JVM调优汇总
2010-02-21 19:18 14416参考网址 http://pengjiaheng.spaces. ... -
log4j的输出转换模式
2009-12-12 10:02 1274转换模式(conversion pattern)为" ... -
java正则表达式用法举例
2009-12-08 11:27 4522java正则表达式真难用啊, 这里整理一个java正则表达式用 ... -
Ibatis TypeHandler使用总结
2009-11-25 19:33 16550ibatis中有一个TypeHandler(准确的说应该是Ty ... -
ibatis参数传递小技巧
2009-10-30 14:21 3922使用ibatis操作数据库的时候, 如果这个操作需要一些参数, ...
相关推荐
### 异步调用的参数及返回值处理详解 #### 一、引言 在现代软件开发中,异步编程模式越来越受到重视。它能够有效提高应用程序的响应速度和资源利用率,尤其在网络请求、文件读写等耗时操作中表现突出。在C#语言中,...
### Java实训教程:SpringMVC方法返回值详解 在深入探讨SpringMVC中方法返回值的具体类型及其使用之前,我们先来简要回顾一下SpringMVC框架的基本概念以及它在整个Java开发过程中的重要性。 #### SpringMVC简介 ...
在这些类中,可以看到形参的使用,例如在创建动物实例时传递参数,以及返回值的使用,例如一个方法可能返回特定的动物实例或者处理结果。 形参在方法签名中声明,用于在调用方法时传递数据。例如,在创建`Cat`或`...
这里我们将详细探讨两种主要的传值方法:通过构造函数传值和通过属性传值。 首先,我们来看**通过构造函数传值**的方法。在C#中,构造函数是一个特殊的方法,用于初始化类的新实例。在Winform窗体中,我们可以在...
在JavaScript中,当需要在新窗口中执行代码并返回结果到当前页面时,通常采用window.showModalDialog()和window.open()这两种方法。以下详细解释这两种方法的用法和特点。 首先,window.showModalDialog()方法用于...
`onStartCommand()` 方法有四种不同的返回值,每种返回值都决定了服务在遇到异常或者系统资源紧张时的行为方式。下面将详细介绍这四种返回值: 1. **START_STICKY:** 当服务被销毁后(例如由于系统资源紧张),...
本文将深入探讨两种利用VB来动态调整Windows显示模式的方法,这两种方法分别是通过调用Windows API函数`ChangeDisplaySettings`以及使用第三方工具QuickRES。 ### 方法一:使用Windows API `ChangeDisplaySettings`...
本文将详细介绍两种在DWR中实现这一功能的方法。 ### 方法一:通过同步调用来获取返回值 这种方法首先将DWR引擎设置为同步模式,然后调用Java方法,并提供一个回调函数来处理返回的数据。在回调函数中,数据会被...
这些扩展方法通常定义在一个静态类中,提供了一种优雅的方式来扩展Unity的标准数学库,使得在处理向量操作时更加灵活和高效。通过熟练掌握这些扩展方法,开发者可以更好地控制游戏对象的行为,提升开发效率。
### MFC中调用控制台CMD进行输出的两种方法 #### 方法一:使用`freopen`函数 在探讨具体的实现之前,我们先了解下`freopen`函数的基本概念及其使用方式。 - **函数定义**: `freopen`函数允许程序员在程序运行...
接口在Java中还有其他用途,如多态性、事件处理等,但这里主要讨论了将其用作形参和返回值的情况。这种设计模式有助于提高代码的可扩展性和可维护性,因为当需要添加新功能或替换现有功能时,只需要创建新的实现了...
为了解决$.ajax()方法无法返回值的问题,可以采取以下两种方法: 1. 将AJAX请求设置为同步(async:false):这可以通过在$.ajax()调用中添加一个选项async:false来实现。这样做后,AJAX请求将同步执行,即在AJAX...
AT+CWMODE命令可以用来切换这两种模式。例如,`AT+CWMODE=1`将ESP8266设置为客户端模式,能够连接到其他WiFi热点;而`AT+CWMODE=2`则将其设置为服务器模式,允许其他设备连接到它。 接下来,我们需要创建和管理UDP...
实现C#中的单例模式通常有两种方法:懒汉式(线程不安全)和饿汉式(线程安全)。更安全的实现方式是使用`Lazy<T>`类或`双重检查锁定`机制。 2. **简单工厂模式**:简单工厂模式是一种静态工厂方法,用于创建对象,...
本文档详细介绍了如何在不同格式的两种语言间实现有效的通讯,特别是涉及汇编语言与高级语言(如C/C++)的交互。 混合编程的主要目标是创建程序模块之间的互调用,确保数据的正确传输以及参数和返回值的有效处理。...
本文将详细介绍`bioskey`函数的使用方法及其返回值的意义,并通过具体的示例代码帮助读者更好地理解。 #### 二、bioskey函数简介 `bioskey`函数是一个在C语言中常用于获取键盘输入的函数,尤其适用于那些需要更高级...
方法调用有两种主要方式:在一个类内部的方法调用与不同类之间的方法调用。目前我们先聚焦于一个类内部的方法调用。 ##### 1. 类内部的方法调用 在同一个类内部,方法调用相对简单。方法调用的语法取决于方法是否...
在Windows Forms编程中,"模式窗"(Modal Window)和"无模式窗"(Modeless Window)是两种常见的窗口展示方式,它们各自有着不同的特点和使用场景。下面将详细讲解这两种窗体的区别、如何创建以及何时使用。 1. **...
3、两种比较器以及sort()方法的重载: 结论:Icomparable接口在需要比较的类中实现;Icomparer接口在任何类中实现,使用时只需将这个类的对象作为参数传给Sort()就行。 4、接口的使用 结论:接口作为参数,即接口的...