如何编写没有Try/Catch的程序

一、异常处理不简单

个人觉得,异常处理对于程序员来说,尤其是对于那些初级.NET程序员来说,是最为熟悉的同时也是最难掌握的。说它熟悉,因为仅仅就是Try/Catch而已。说它难以掌握,很多开发人员却说不清楚Try/Catch应该置于何处?什么情况下需要对异常进行日志记录?什么情况下需要对异常进行封装?什么情况下需要对异常进行替换?对于捕获的异常,在什么情况下需要将其再次抛出?什么情况下则不需要。总之,异常处理没有我们想象的那么简单。

无论对于何种类型的应用,异常处理都是必不可少的。合理的异常处理应该是场景驱动的,在不同的场景下,采用的异常处理策略往往是不同的。异常处理的策略应该是可配置的,因为应用程序出现怎样的异常往往是不可预测的,现有异常策略的不足往往需要在真正出现某种异常的时候才会体现出来,所以我们需要一种动态可配置的异常处理策略维护方式。目前有一些开源的异常处理框架提供了这种可配置的、场景驱动的异常处理方式,EnterLib的Exception Handling Application Block就是一个不错的选择。

二、异常处理对于最终的开发人员是透明的

“异常处理对于最终的开发人员是透明的”,可能这句话说得有点过头。但是,就我个人的项目经验来讲,这是一种理想的状态。由于异常策略是一般是通过配置动态配置的,不需要反映在代码上面。如果能够通过框架的方式提供异常处理的实现,使开发人员无需编写任何异常处理的代码,只需要关注业务流程的实现就可以了,这不仅能够提高开发的效率,也能够提高系统的可维护性。

我们目前的项目是一个典型的分布式应用,所有的业务流程的处理和数据访问都实现在服务端,最终以WCF服务的形式暴露给客户端(Smart Client)和第三方应用。所有客户端和服务端从逻辑上具有相应的层次划分,但是异常处理仅仅实现在两个地方,一个地方是WCF服务本身,另一个实现 UI层。忘了说明一点,我们项目直接将EnterLib的Exception Handling Application Block作为我们的异常处理框架。对于服务端的异常处理来说,我们通过WCF与EHAB的集成来实现的(《WCF与Exception Handling AppBlock集成》),所以不需要开发人员添加任何一句Try/Catch代码。但是客户端来说,对于某个控件的事件来说,由于UI本身就是处于整个调用栈的最顶层,很难通过基于AOP的拦截机制来实现对异常处理的动态注入,所以客户端会出现非常类似于下面代码所示的Try/Catch。

1: private void buttonCalculate_Click(object sender, EventArgs e)
2: {
3:   try
4:   {
5:     //
6:   }
7:   catch (Exception ex)
8:   {
9:     if (ExceptionPolicy.HandleException(ex, "policyName"))
10:     {
11:       throw;
12:     }
13:   }
14:
15: }

我是一个对重复代码具有强迫症的人,看到两个相同的代码我都有对代码进行重构的冲动,何况如此众多的相同代码充斥在客户端。

时间: 2024-09-09 02:02:19

如何编写没有Try/Catch的程序的相关文章

java编写TCP方式的通信程序

程序   Java API中封装了大量的函数,供编写网络通信程序时使用.这使得java在网络方面具有强大的功能.用java编写TCP方式的通信程序比较简单,但也有一些问题需要注意. 以下为监听主程序,监听程序在发现客户端连接后,启动一个会话socket线程,以实现实时发送,接收信息和多客户端同时工作.import java.io.*;import java.lang.*;import java.net.ServerSocket;import java.net.Socket;//主程序一直处于监听

中文字符-如何用C语言编写一个简单的输入法程序,要求可以输入汉字。

问题描述 如何用C语言编写一个简单的输入法程序,要求可以输入汉字. 不太清楚汉字在计算机中是如何存储的,想知道例如微软的智能ABC以及搜狗输入法是怎样实现拼音拼写下的汉字输入. 解决方案 首先要有一个汉字的编码库,比如GB2312编写的是拼音输入法的话,还要建立一个拼音与汉字对应的数据库然后根据用户输入的拼音,提示出对应的汉字(汉字的优先顺序由数据库决定,同时还可以学习该用户的使用习惯)如果输入法还支持智能联想输入的话,还要加入词库(也有优先级),这样可以根据前一个字来推断出下一个可能的字 解决

c语言-用C语言编写能进行四则运算的程序

问题描述 用C语言编写能进行四则运算的程序 我想用C语言编一个能进行简单的四则运算的程序,应该怎么写,请详细解释一下输入和计算部分 解决方案 实现四则运算是比较简单的,你可以使用两个栈,一个栈用来存贮操作的数字(0~n),一个栈用来存储操作符(+-等).你先把四则运算表达式存为一个字符串,然后遍历各个字符,如果是数字,那就存起来,如果是操作符,那就与前一个操作符比较,看看优先级是不是比前一个大,如果是,那就存起来,如果不是,那就把数字栈里的前两个数按照前一个操作符进行运算.结果用一个变量保存起来

c语言-用vc6.0编写一个整人的小程序(我想要详细的做法和解除的方法)

问题描述 用vc6.0编写一个整人的小程序(我想要详细的做法和解除的方法) 通过QQ等发给别人,在对面没有编辑环境的情况下也能整到他(比如让他骂自己不然就重启电脑:让他夸我不然锁住计算机屏幕等等!顺便告诉我怎么发给他,在对方打开时候就执行!) 解决方案 编译完之后的exe就可以直接发了吧 解决方案二: 你可以网上找一个相关的批处理文件,比如说隔一段时间把他的电脑的声音关掉等等,然后设置成开机运行就好 解决方案三: 改变VC6.0程序方法.

求帮助啊 急用啊-用c语言编写剔除粗大误差的程序和相应的流程图

问题描述 用c语言编写剔除粗大误差的程序和相应的流程图 用c语言编写剔除粗大误差的程序以及流程图,用那种方法都行,只要正确就行 解决方案 什么叫最大误差?给个定义好么?没有定义怎么解决你的问题 解决方案二: 您可能没看清题,是粗大误差不是最大误差,有答案请尽快回答,急急急

visual studio-c#编写的VSTO Excel AddIn 程序实现在线更新

问题描述 c#编写的VSTO Excel AddIn 程序实现在线更新 使用vs2013编写了一个vsto Excel Addin ,但是后期添加的东西比较多,要分不同的版本发布,求大神帮忙,怎么实现在线更新功能呢???? 解决方案 实现软件自动在线升级的原理 写两个程序,一个是主程序:一个是升级程序:所有升级任务都由升级程序完成. 1.启动升级程序,升级程序连接到网站,下载新的主程序(当然还包括支持的库文件.XML配置文档等)到临时文件夹: 2.升级程序获取服务器端XML配置文件中新版本程序的

linux下如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况?

问题描述 linux下如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况? 初学,linux(ubuntu)环境下,如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况?初学者,希望从这些基础程序入手,谢谢大家~ 解决方案 读取proc下面的文件. /proc/stat 里面是CPU使用情况,/proc/meminfo里面是内存使用情况,进程信息在/proc/$pid/stat,statm里面. /proc/net/dev里面是网络使用情况,磁盘IO可以使用iostat命令

char-VS2010下编写基于TCP的网络应用程序运行出现乱码,一堆“烫”字,求高手救命

问题描述 VS2010下编写基于TCP的网络应用程序运行出现乱码,一堆"烫"字,求高手救命 客户端:#include #include #pragma comment(libws2_32.lib"")void main(){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1 1 );err = WSAStartup( wVersionRequested

c#-C#不依赖任何系统库函数,编写一个快速排序算法的程序,要求使用递归,越简单越好

问题描述 C#不依赖任何系统库函数,编写一个快速排序算法的程序,要求使用递归,越简单越好 C#不依赖任何系统库函数,编写一个快速排序算法的程序,要求使用递归,越简单越好 解决方案 先mark下,没有环境,回头给你写 解决方案二: 二分查找的递归算法和非递归算法 解决方案三: 快速排序的递归和非递归实现