关因而使用枚举或布尔类型来表示方法执行状态,仍是使用异常,能够参考这里的文章: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 }