• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 通用異常處理框架(2)

    發表于:2014-04-28來源:博客園作者:風語者·疾風點擊數: 標簽:
    首先需要在Web.Config或者App.Config中添加這行 section name =ExManager type =ExManagement.Config.ExSectionHandler, ExManagement.Config / 這句是指定用ExManagement.Config.ExSectionHandle

      首先需要在Web.Config或者App.Config中添加這行

    <section name="ExManager" type="ExManagement.Config.ExSectionHandler, ExManagement.Config" />

      這句是指定用ExManagement.Config.ExSectionHandler類來處理ExManager配置節點

      節點  包含ErrorCodeSource和ConnectionString兩個屬性。

      ErrorCodeSource屬性  該屬性是設置從何種數據源獲取錯誤編號與錯誤信息的對應關系。其值只能是枚舉ErrorCodeSource的值:XML或者DB。

      ConnectionString屬性  該屬性是設置數據源的位置。若ErrorCodeSource屬性設置的是XML,則此處為XML文件的FullName;若ErrorCodeSource屬性設置的是DB,則此處為數據庫的連接字符串。

      DataTable屬性  設置記錄異常日志使用的表名。

      節點  此節點為 節點的子節點,至少得有一個以上的子節點。包含Name、Type、ReturnMode以及AlertType屬性。

      Name屬性  為該異常處理器確定一個名稱。在項目中調用異常處理方法時,需要指定這個名稱。一般建議用層的名字或者項目的名字。

      Type屬性  指定異常處理器的類,格式為Type=”ClassName, AssemblyName”。該類必須從ExHandlerBase繼承。

      ReturnMode屬性  異常處理器處理后返回給項目的值類型。對應枚舉ExReturnMode的值,只能取Exception/ExceptionString/ErrorCode/ErrorString,分別含義是:拋出異常/返回異常詳細描述/返回錯誤編號/返回錯誤信息。

      AlertType屬性  報告異常信息的處理方式。對應枚舉ExAlertType的值,只能取None/WebUI/WinUI。

      < LogHandler>節點  此節點為節點的子節點,節點可以有0到若干個< LogHandler>子節點。

      Type屬性  用于指定日志記錄處理器的類。格式為Type=”ClassName, AssemblyName”。該類必須實現IExLogHandler接口。

      ConnectionString屬性  該屬性是設置記錄異常日志的數據源位置。

      DataTable屬性  設置記錄異常日志使用的表名。

      ExManagement.Interface包

      包含了IExLogHandler和I Message兩個接口以及ExHandlerBase基類,可以通過實現這些接口來對框架進行擴展。如圖三-3:

    ExManagement.Interface.jpg

      圖三-3

      以下是ExHandlerBase基類中加載所有異常日志對象的方法:

    public void LoadLogHandler(ExManagerConfig.ExHandlerConfig config)

    {

    m_ExHandlerConfig = config;

    foreach (ExManagerConfig.LogHandlerConfig logConfig in config.LogConfigColletion)

    {

    object exLogHandler = System.Activator.CreateInstance(Type.GetType(logConfig.Type));

    lstLogHandler.Add(exLogHandler);

    }

    }

      通過遍歷配置文件中該節包含的所有子節點,并將配置中指定的LogHandler類反射實例化,將對象存入隊列中。

      ExManagement.MessageHandler包

      該包包含兩個IMessage接口的實現,分別完成對異常信息在WinUI和WebUI中的彈出提示功能。WinFormMessage和WebMessage分別引用了System.Web.Dll和System. Windows.Forms.Dll。如圖三-4。

    ExManagement.MessageHandler.jpg

      圖三-4

      ExManagement包

      包含了ExManager類和ErrorInfo類,是框架中核心的業務流程控制模塊。如圖三-5

    ExManagement.jpg

      圖三-5

      ErrorInfo類:根據ErrorId查詢對應的ErrorString。在這個類里,會根據在配置文件中節的值去指定的數據源(XML文件或者數據庫)查詢。

      ExManager類,該類是一個單例類,會在第一次實例化時獲取配置信息實體對象,并按照配置文件把所有指定的異常處理類實例化后并存入一個哈希表中。以后實例化該類都會重復使用之前實例化的該對象,避免反射造成的性能影響。通過調用該類的ProcessException()方法將捕捉到的異常對象,錯誤編號,用來處理異常的異常處理器名(建議為該層的名稱)傳遞給框架,并按照參數從哈希表中取出對應的異常處理對象,調用接口對異常進行處理。

      ExManagement.Handler包

      只包含一個默認的異常處理器類:DefaultExHandler,它從ExHandlerBase基類繼承。下面是該類里最重要的ProcessExeception方法。

    public override string ProcessExeception(Exception ex, string strUserId, string strErrorCode)

    {

    // 記錄異常信息

    LogEx(ex, strUserId, strErrorCode);

     

    switch(m_ExHandlerConfig.ReturnMode)

    {

    // 返回類型為錯誤編碼

    case ExManagement.ExReturnMode.ErrorCode:

    {

    return strErrorCode;

    }

    // 返回類型為詳細錯誤信息(友好提示)

    case ExManagement.ExReturnMode.ErrorString:

    {

    return ExManagement.ExManager.GetErrorInfoByCode(strErrorCode);

    }

    // 返回類型為詳細異常信息(Exception.Message

    case ExManagement.ExReturnMode.ExceptionString:

    {

    return ex.Message;

    }

    // 將異常向上拋出

    case ExManagement.ExReturnMode.Exception:

    {

    // 如果是該層自身引發的異常則包裝后拋出

    if(ex.GetBaseException() == ex)

    {

    throw new Exception(string.Format("{0}層發生異常:{1},{2}",

    m_ExHandlerConfig.Name, strErrorCode, ex.Message), ex);

    }

    // 若是捕捉到的是包裝后的異常(即上層拋出的)

    else

    {

    throw ex;

    }

    }

    default:

    {

    return null;

    }

    }

    }

    原文轉自:http://kb.cnblogs.com/page/81682/

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>