`

关于方法返回值的两种处理模式

    博客分类:
  • Java
阅读更多
目前在处理返回值方面, 有两种代码风格:

一种是这样:
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  
 

相关推荐

    异步调用的参数及返回值

    ### 异步调用的参数及返回值处理详解 #### 一、引言 在现代软件开发中,异步编程模式越来越受到重视。它能够有效提高应用程序的响应速度和资源利用率,尤其在网络请求、文件读写等耗时操作中表现突出。在C#语言中,...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_4_方法返回值 共25页.pptx

    ### Java实训教程:SpringMVC方法返回值详解 在深入探讨SpringMVC中方法返回值的具体类型及其使用之前,我们先来简要回顾一下SpringMVC框架的基本概念以及它在整个Java开发过程中的重要性。 #### SpringMVC简介 ...

    java 形参和返回值练习

    在这些类中,可以看到形参的使用,例如在创建动物实例时传递参数,以及返回值的使用,例如一个方法可能返回特定的动物实例或者处理结果。 形参在方法签名中声明,用于在调用方法时传递数据。例如,在创建`Cat`或`...

    C# Winform 窗体传值及接收返回值

    这里我们将详细探讨两种主要的传值方法:通过构造函数传值和通过属性传值。 首先,我们来看**通过构造函数传值**的方法。在C#中,构造函数是一个特殊的方法,用于初始化类的新实例。在Winform窗体中,我们可以在...

    Js 弹出框口并返回值的两种常用方法

    在JavaScript中,当需要在新窗口中执行代码并返回结果到当前页面时,通常采用window.showModalDialog()和window.open()这两种方法。以下详细解释这两种方法的用法和特点。 首先,window.showModalDialog()方法用于...

    android Service中onStartCommand返回值.txt

    `onStartCommand()` 方法有四种不同的返回值,每种返回值都决定了服务在遇到异常或者系统资源紧张时的行为方式。下面将详细介绍这四种返回值: 1. **START_STICKY:** 当服务被销毁后(例如由于系统资源紧张),...

    精彩编程与编程技巧-利用VB动态改变Windows显示模式的两种方法...

    本文将深入探讨两种利用VB来动态调整Windows显示模式的方法,这两种方法分别是通过调用Windows API函数`ChangeDisplaySettings`以及使用第三方工具QuickRES。 ### 方法一:使用Windows API `ChangeDisplaySettings`...

    在DWR中实现直接获取一个JAVA类的返回值的两种方法

    本文将详细介绍两种在DWR中实现这一功能的方法。 ### 方法一:通过同步调用来获取返回值 这种方法首先将DWR引擎设置为同步模式,然后调用Java方法,并提供一个回调函数来处理返回的数据。在回调函数中,数据会被...

    unity vector返回值拓展

    这些扩展方法通常定义在一个静态类中,提供了一种优雅的方式来扩展Unity的标准数学库,使得在处理向量操作时更加灵活和高效。通过熟练掌握这些扩展方法,开发者可以更好地控制游戏对象的行为,提升开发效率。

    Java接口名作为形参和返回值

    接口在Java中还有其他用途,如多态性、事件处理等,但这里主要讨论了将其用作形参和返回值的情况。这种设计模式有助于提高代码的可扩展性和可维护性,因为当需要添加新功能或替换现有功能时,只需要创建新的实现了...

    jquery ajax return没有返回值的解决方法

    为了解决$.ajax()方法无法返回值的问题,可以采取以下两种方法: 1. 将AJAX请求设置为同步(async:false):这可以通过在$.ajax()调用中添加一个选项async:false来实现。这样做后,AJAX请求将同步执行,即在AJAX...

    MFC中调用控制台CMD进行输出两种方法

    ### MFC中调用控制台CMD进行输出的两种方法 #### 方法一:使用`freopen`函数 在探讨具体的实现之前,我们先了解下`freopen`函数的基本概念及其使用方式。 - **函数定义**: `freopen`函数允许程序员在程序运行...

    hal库基于esp8266,bw16 AT指令进行多连接分别做成服务器,客户端,连接UDP和返回值的处理

    AT+CWMODE命令可以用来切换这两种模式。例如,`AT+CWMODE=1`将ESP8266设置为客户端模式,能够连接到其他WiFi热点;而`AT+CWMODE=2`则将其设置为服务器模式,允许其他设备连接到它。 接下来,我们需要创建和管理UDP...

    C#设计模式.rar

    实现C#中的单例模式通常有两种方法:懒汉式(线程不安全)和饿汉式(线程安全)。更安全的实现方式是使用`Lazy<T>`类或`双重检查锁定`机制。 2. **简单工厂模式**:简单工厂模式是一种静态工厂方法,用于创建对象,...

    汇编语言课件详解---在不同格式的两种语言间提供有效的通讯方式

    本文档详细介绍了如何在不同格式的两种语言间实现有效的通讯,特别是涉及汇编语言与高级语言(如C/C++)的交互。 混合编程的主要目标是创建程序模块之间的互调用,确保数据的正确传输以及参数和返回值的有效处理。...

    C语言bioskey返回值大全

    本文将详细介绍`bioskey`函数的使用方法及其返回值的意义,并通过具体的示例代码帮助读者更好地理解。 #### 二、bioskey函数简介 `bioskey`函数是一个在C语言中常用于获取键盘输入的函数,尤其适用于那些需要更高级...

    java方法调用

    方法调用有两种主要方式:在一个类内部的方法调用与不同类之间的方法调用。目前我们先聚焦于一个类内部的方法调用。 ##### 1. 类内部的方法调用 在同一个类内部,方法调用相对简单。方法调用的语法取决于方法是否...

    WinFrom之模式窗

    在Windows Forms编程中,"模式窗"(Modal Window)和"无模式窗"(Modeless Window)是两种常见的窗口展示方式,它们各自有着不同的特点和使用场景。下面将详细讲解这两种窗体的区别、如何创建以及何时使用。 1. **...

    单例模式 工厂模式DEMO

    3、两种比较器以及sort()方法的重载: 结论:Icomparable接口在需要比较的类中实现;Icomparer接口在任何类中实现,使用时只需将这个类的对象作为参数传给Sort()就行。 4、接口的使用 结论:接口作为参数,即接口的...

Global site tag (gtag.js) - Google Analytics