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

背景

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

今天贴出一个真实的场景(一个朋友重构以前和以后的代码)供你们参考。浏览器

一个朋友的示例

重构前app

重构后google

示例分析

重构前spa

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

重构后blog

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

有朋友会问:若是某些异常须要个性化处理咋办?,答:扩展你的AOP逻辑。更简单的作法是使用自定义异常 + catch就好了,没有被catch的异常仍是会被拦截。it

备注

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

一个示例

你但愿获取验证信息,而后对此作进一步的处理(包装成UI友好的信息),这时用异常明显不合理。而若是出现了验证失败,程序要当即结束,对于刚才包装好的验证信息,能够采用异常的形式返回给UI,代码以下:

1 var validationResult = entity.Validate()
2 if(!validationResult.IsValid())
3 {
4    throw new InvalidationException(CreateMessage(validationResult));
5 }
相关文章
相关标签/搜索