通用异常处理框架(2)

发表于:2014-05-26来源:博客园作者:風語者·疾風点击数: 标签:异常
首先需要在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/