工作了几年了,不过一直都是在一些小单位做一些小程序,各方面都不是很规范,一般写的程序大体功能都正确,就是对于异常的处理比较模糊,实在不知道该怎么弄。
比如说用C#读取一个文件,光一个打开操作有很多异常,比如文件不存在,权限不够,无效磁盘路径,文件IO错误,传入的参数错误,对于这些异常,我该怎么处理?
直接catch一个异常的基类,然后弹个对话框,告诉用户打开失败?这个处理明显不够好吧,太笼统了。
对不同的异常分别进行catch,然后分别处理?这样处理似乎太繁琐,光一个打开操作就要跟一大堆catch,然后一个读取又要跟一大堆catch。

解决方案 »

  1.   

    如果只是提示异常一下就可以用catch里e直接提示就好了.
      

  2.   

    一般分层的话,不同层定义不同的ApplicationException比如:DALException/BLLException/UIException
      

  3.   


    比如说,我有一个类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类会不会变得很臃肿啊,异常处理的代码比正常的代码都多了。
      

  4.   

    class MyException : Exception
    {
        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系统来处理
      

  5.   

    其实我的意思就是:做一个稳定的系统是否有必要处理每一个可能会抛出的异常?
    如果确实要处理所有异常,是用n个catch块来处理不同的异常还是直接catch System.Exception?
    如果不需要处理所有异常,怎么来合理的区分哪些需要处理哪些不需要处理?(比如上面打开文件,可以引发那么多异常,哪些是必须处理的,哪些可以不用处理?而且单单一个Open就有这么多异常,感觉处理异常导致代码很乱很难看啊。)
      

  6.   

    主体方法
    try
    {
       //....
    }
    catch(Exception e)
    {
        e.message
    }
    小方法里面的
    try
    {
     // ... to do
    }
    catch(Exception e)
    {
          throw e;
    }
      

  7.   

    恩,楼主其实 问了一个很好的问题, 你这个问题 我想了几年了 到目前还没找到非常好的解决方法,
    不过 代码大全 第八章 可能会给你一些思路 另外 那些异常不应该 都抛出 你可以自己写入日志 对上层提供一些本函数 或类 无法解决的问题 或者 需要给上层的一些东西 (当然这样很模糊 具体如何分辨把握 可能需要结合 类职责来考虑)我看过很多开源的(emule ,ACE)都是采用一般的方法 没有太好的解决之道
    楼主有答案了 给我 说说 你这个问题可以 写本书了 不知道业内 有无专门的书讲解
      

  8.   

    小方法里面的try catch完全是多此一举啊,就算不这么处理,异常也会传递出去。
      

  9.   

    1. 如果是asp.net web应用程序,可以在page_error、application_error里处理
    2. 个人一般在业务逻辑层处理异常
      

  10.   

    建议楼主可以研究一下Exception类下的子类所处理的异常情况·
      

  11.   

    在业务逻辑层处理比较好了。
    在页面后台有需要的地方再添加少量的try
      

  12.   

    可以继承ApplicationException,自己来定义异常的类型
    自定义异常
      

  13.   

    我的方法基本就是:
    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置为空!
      

  14.   


    再详细补充:
    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 网页已禁止