.NET:再论异常处理,一个真实的故事

背景

关于是使用枚举或布尔类型来表示方法执行状态,还是使用异常,可以参考这里的文章:http://www.google.ee/search?q=site%3Awww.cnblogs.com%2Fhappyframework%2F%20%E5%BC%82%E5%B8%B8

今天贴出一个真实的场景(一个朋友重构之前和之后的代码)供大家参考。

一个朋友的示例

重构前

重构后

示例分析

重构前

使用枚举或布尔类型来表示方法执行状态,导致程序中出现了大量的if(xxx){ //异常流程处理 },这部分代码会充斥到所有地方,程序中包括了对异常路径的处理,随着调用栈的深度增加,编程更不爽,如:需要在下层的枚举状态之上再扩展自己的枚举状态。

重构后

用异常代表方法执行失败的状态,在边界类(控制器)中采用AOP的方式拦截异常并自动输出友好的Action Result给浏览器,程序中只有正常的代码,看起来非常清晰。

有朋友会问:如果某些异常需要个性化处理咋办?,答:扩展你的AOP逻辑。更简单的做法是使用自定义异常 + catch就行了,没有被catch的异常还是会被拦截。

备注

关于什么情况使用异常?什么情况使用返回结果?只有一条原则:不要用异常处理正常的业务逻辑。

一个示例

你希望获取验证信息,然后对此做进一步的处理(包装成UI友好的信息),这时用异常明显不合理。而如果出现了验证失败,程序要立即结束,对于刚才包装好的验证信息,可以采用异常的形式返回给UI,代码如下:

1 var validationResult = entity.Validate()
2 if(!validationResult.IsValid())
3 {
4 throw new InvalidationException(CreateMessage(validationResult));
5 }
 
分类: .NET

.NET:再论异常处理,一个真实的故事的更多相关文章

  1. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  2. Java基础知识强化之IO流笔记52:IO流练习之 把一个文件中的字符串排序后再写入另一个文件案例

    1. 把一个文件中的字符串排序后再写入另一个文件 已知s.txt文件中有这样的一个字符串:"hcexfgijkamdnoqrzstuvwybpl" 请编写程序读取数据内容,把数据排 ...

  3. struts2.1.*中再实现了一个servlet的方法

    学习Struts2也有一段时间了,今天用Servlet写了一个验证码,然后搬到Struts2中,惊奇地发现Servlet无法访问,出现404错误!后来折腾了半天,终于找出原因了.这也算我学习中的一个重 ...

  4. 1 - JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))

    java虚拟机的内存区域分配   在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时的这段空间的分 ...

  5. vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类

    vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类 2011-10-20 12:00 486人阅读 评论(0) 收藏 举报 一.将类做成DLL 方法一: 你可以通过在命令行下用命令将以 ...

  6. 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 数据库连接不释放测试 连接池 释放连接 关闭连接 有关 redis-py 连接池会导致服务器产生大量 CLOSE_WAIT 的再讨论以及一个解决方案

    import pymysqlfrom redis import Redisimport time h, pt, u, p, db = '192.168.2.210', 3306, 'root', 'n ...

  7. 服务器上如何再另外添加一个E盘

    我的电脑按右键,选择管理..然后在左边选择磁盘管理,然后对着C盘或者D盘按右键,选择压缩卷,等一下下,就会出现个框框让你选择压缩多少,然后多了一个可用空间,再把它分成一个分区就OK拉 步骤:对可用空间 ...

  8. 数据库筛选用户,然后去掉一部分(列表求差),再随机返回一个用户。sqlalchemy + python集合(set) + random

    sqlalchemy和flask-sqlalchemy之间的东西不是太清晰. sqlalchemy文档太他妈多了.日. 今天遇到的实例. 用户进行随机匹配,系统随机返回一个一定筛选条件下的用户.为了用 ...

  9. 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

    hello,大家好呀,我是小楼. 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说不定可以水,哦不.. ...

随机推荐

  1. C语言学习之路,第一篇章。

    看的书是 C  primer plus  ,这本书好评很多, 学过C#,没有精通,了解Java,所以看这本书会很容易上手,编译器用的是VC++6.0,因为VS2010好像不支持C99标准,有些代码功能 ...

  2. MVC4新功能...压缩和合并js文件和样式文件

    1.在App_Start文件夹中BundleConfig.cs类中添加相应的文件 1.1bundles.Add(new ScriptBundle("~/bundles/adminJs&quo ...

  3. MFC 界面编程 可参考资料

    http://www.codeproject.com/Articles/26887/A-user-draw-button-that-supports-PNG-files-with-tr http:// ...

  4. 快速构建Windows 8风格应用8-贴靠视图

    原文:快速构建Windows 8风格应用8-贴靠视图 本篇博文主要介绍如何切换出贴靠视图.关于贴靠视图的设计.关于贴靠视图的应用程序栏和如何实现贴靠视图. 如何切换出贴靠视图 第一步:水平方向全屏视图 ...

  5. 初探async await 实现多线程处理

    初探async await 实现多线程处理 这是微软关于Async的介绍:http://msdn.microsoft.com/en-us/library/hh156513.aspx 这是await : ...

  6. JS中通过call方法实现继承

    原文:JS中通过call方法实现继承 讲解都写在注释里面了,有不对的地方请拍砖,谢谢! <html xmlns="http://www.w3.org/1999/xhtml"& ...

  7. [译]在运行时内存中的Java对象是怎么样的

    (文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...

  8. 手工配置Service的过程中。

    正在使用srvctl创建service时间,需要注意TAF政策选择必须是dbms_service套餐配置.下面的例子演示了如何创建一个服务felix_ora: 1.查看现有的创建之前系统service ...

  9. 地图坐标Base64转换数字坐标

    测试地图源码==百读Demo<html> <head> </head> <body> <script type="text/javasc ...

  10. mvc @html.editor怎么修改宽度 和其他属性

    <style type="text/css"> #dob { width:6em; } </style> @using (Html.BeginForm()) ...