工作了几年了,不过一直都是在一些小单位做一些小程序,各方面都不是很规范,一般写的程序大体功能都正确,就是对于异常的处理比较模糊,实在不知道该怎么弄。
比如说用C#读取一个文件,光一个打开操作有很多异常,比如文件不存在,权限不够,无效磁盘路径,文件IO错误,传入的参数错误,对于这些异常,我该怎么处理?
直接catch一个异常的基类,然后弹个对话框,告诉用户打开失败?这个处理明显不够好吧,太笼统了。
对不同的异常分别进行catch,然后分别处理?这样处理似乎太繁琐,光一个打开操作就要跟一大堆catch,然后一个读取又要跟一大堆catch。
比如说用C#读取一个文件,光一个打开操作有很多异常,比如文件不存在,权限不够,无效磁盘路径,文件IO错误,传入的参数错误,对于这些异常,我该怎么处理?
直接catch一个异常的基类,然后弹个对话框,告诉用户打开失败?这个处理明显不够好吧,太笼统了。
对不同的异常分别进行catch,然后分别处理?这样处理似乎太繁琐,光一个打开操作就要跟一大堆catch,然后一个读取又要跟一大堆catch。
比如说,我有一个类Data,其中有个方法ReadFromFile(string path),在窗口Form1类中定义了Data data字段。问题来了,在Form1类中的OnLoad函数中,我调用了data.ReadFromFile("name"),这时候针对不同的异常,我要做不同的工作,比如FileNotFoundException未发现文件,则跳出一个数据输入对话框,让用户输入数据来初始化data;比如IOException,读写异常,就关闭应用程序;比如ArgumentException,参数为null的异常,只需要在debug版本中弹出对话框;UnauthorizedAccessException或者PathTooLongException,用对话框告诉用户出现了什么问题,即e.Message;其他异常不做处理。首先这些异常都是发生在Data类中的,如果由Data类来处理,那么势必无法调用对话框(因为data类并不确定给WinForm程序调用,可能只是给Console程序调用);如果由Form1类来catch并且处理,那么Data类的设计者是不是应该告诉Form1类的设计者这个函数可能抛出的所有异常?其次仅仅一个读文件的函数就需要catch这么多东西,那这个Data类会不会变得很臃肿啊,异常处理的代码比正常的代码都多了。
{
int m_eventID;
int m_eventLevel; // Debug, Trace, Falut, Warring
string mydescription;
MyException(int id, int level, string description){}
}try
{
// ... to do
}
catch(MyException ex)
{
// catch with custom handle
}这是一个最简单的示范代码
参考看看
一般来说会定义eventid表及事件层级
然后用自行开发的handle系统来处理
如果确实要处理所有异常,是用n个catch块来处理不同的异常还是直接catch System.Exception?
如果不需要处理所有异常,怎么来合理的区分哪些需要处理哪些不需要处理?(比如上面打开文件,可以引发那么多异常,哪些是必须处理的,哪些可以不用处理?而且单单一个Open就有这么多异常,感觉处理异常导致代码很乱很难看啊。)
try
{
//....
}
catch(Exception e)
{
e.message
}
小方法里面的
try
{
// ... to do
}
catch(Exception e)
{
throw e;
}
不过 代码大全 第八章 可能会给你一些思路 另外 那些异常不应该 都抛出 你可以自己写入日志 对上层提供一些本函数 或类 无法解决的问题 或者 需要给上层的一些东西 (当然这样很模糊 具体如何分辨把握 可能需要结合 类职责来考虑)我看过很多开源的(emule ,ACE)都是采用一般的方法 没有太好的解决之道
楼主有答案了 给我 说说 你这个问题可以 写本书了 不知道业内 有无专门的书讲解
2. 个人一般在业务逻辑层处理异常
在页面后台有需要的地方再添加少量的try
自定义异常
protected void Application_Error(object sender, EventArgs e)
{
Response.Write("发生错误:"+Server.GetLastError().ToString());
Server.ClearError();
}
这样在任何一个页面抛出异常时都会执行这个Error方法。 也可以在web.config里加<customErrors mode="On" defaultRedirect="Error.aspx"></customErrors>
就直接指向该页了,但是如果这两个都存在的话是先执行了Application_Error。所以如果要使用web.config方法,需要把Application_Error置为空!
再详细补充:
web.config里......<compilation
defaultLanguage="c#"
debug="false"
/>
<customErrors mode="RemoteOnly" defaultRedirect="error/genericerror.htm" >
<error statusCode="500" redirect="error/callsupport.htm"/>
<error statusCode="404" redirect="error/notfound.htm"/>
<error statusCode="403" redirect="error/noaccess.htm"/>
</customErrors>
建立四个htm(aspx也行)文件,放到error文件夹下面.error/genericerror.htm 一般性错误error/callsupport.htm 内部服务器错误error/notfound.htm 网页未找到error/noaccess.htm 网页已禁止