📄 exmanager.cs
字号:
using System;
using System.Collections;
using System.Configuration;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Xml;
using ExManagement.Config;
using ExManagement.Interface;
namespace ExManagement
{
// 项目中会用到的表示层名称的枚举,枚举名称对应配置文件中的ExHandler节点的Name属性
public enum LayerName {BussinessLayer,FacadeLayer,WinUILayer,WebUILayer,WorkFlowLayer};
/// <summary>
/// ExManager 的摘要说明。
/// </summary>
public class ExManager
{
/// <summary>
/// 静态的异常处理配置信息
/// </summary>
private static ExManagerConfig ConfigCollection = GetConfig();
/// <summary>
/// 静态的异常处理器容器
/// </summary>
private static Hashtable htbExHandlers = new Hashtable();
// 异常处理器对象是否已经加载
private static bool IsLoadHanlder = false;
// 实例根据错误代码反查错误信息的类
private static ErrorInfo objErrorInfo = new ErrorInfo(ConfigCollection);
// 构造函数
public ExManager()
{
if(!IsLoadHanlder)
{
GetHandlers();
}
}
/// <summary>
/// 根据配置文件,反射得到所有的异常处理器实例对象
/// </summary>
private void GetHandlers()
{
// 遍历配置文件中的所有ExHandler节点
foreach(ExManagerConfig.ExHandlerConfig configHandler in ConfigCollection)
{
// 根据配置信息,反射得到异常处理类的实例对象,并存到Hashtable中
ExHandlerBase objHandler = System.Activator.CreateInstance(Type.GetType(configHandler.Type)) as ExHandlerBase;
objHandler.LoadLogHandler(configHandler);
htbExHandlers.Add(configHandler.Name, objHandler);
}
// 是否加载异常处理实例对象的标志位重置
IsLoadHanlder = true;
}
/// <summary>
/// 调用指定的异常处理器,进行异常处理(提供给系统调用的唯一接口)
/// </summary>
/// <param name="ex"></param>
/// <param name="strErrorCode"></param>
/// <param name="strExHanlderName"></param>
/// <returns></returns>
public string ProcessExeception(Exception ex, string strErrorCode, string strExHanlderName, string strUserId, params string [] strExtention)
{
return ProcessExeception(ex, strErrorCode, strExHanlderName, strUserId, MessageBoxType.Error, strExtention);
}
/// <summary>
/// ProcessExeception方法的重载,提供参数可以选择错误提示窗口的类型(错误/提示信息)
/// </summary>
/// <param name="ex"></param>
/// <param name="strErrorCode"></param>
/// <param name="strExHanlderName"></param>
/// <param name="strUserId"></param>
/// <param name="MessageType"></param>
/// <param name="strExtention"></param>
/// <returns></returns>
public string ProcessExeception(Exception ex, string strErrorCode, string strExHanlderName, string strUserId, MessageBoxType MessageType, params string [] strExtention)
{
ExHandlerBase exHandler;
string strException;
// 获取指定的异常处理器对象
try
{
exHandler = (ExHandlerBase)htbExHandlers[strExHanlderName];
}
catch(Exception e)
{
// 此处出现异常只能是在开发时
throw new Exception("指定的异常处理器并不存在,请检查名称是否正确或异常处理器是否正常加载", e);
}
// 执行异常处理过程,若配置信息中返回方式为异常对象,则该函数会在记录异常之后将异常重新包装后抛出
strException = exHandler.ProcessExeception(ex, strUserId, strErrorCode, strExtention);
IMessage message = null;
// 根据配置信息中指定的异常输出类型不同,确定使用不同的消息对象
switch(exHandler.ExHanlderConfig.AlertType)
{
case ExManagement.Config.ExAlertType.WinUI:
{
message = new ExManagement.MessageHandler.WinFormMessage();
break;
}
case ExManagement.Config.ExAlertType.WebUI:
{
message = new ExManagement.MessageHandler.WebMessage();
break;
}
case ExManagement.Config.ExAlertType.None:
{
break;
}
default:
{
break;
}
}
// 即ExHanlderConfig.AlertType不等于None
if(message != null)
{
message.ShowMessage(strException, MessageType);
}
return strException;
}
/// <summary>
/// 根据错误Id获取详细的错误信息
/// </summary>
/// <param name="strErrorCode"></param>
/// <returns></returns>
public static string GetErrorInfoByCode(string strErrorCode)
{
return objErrorInfo.GetErrorInfoById(strErrorCode);
}
/// <summary>
/// 从资源文件ExManagement.ExManagementConfig.Xml中获取
/// </summary>
/// <returns></returns>
private static ExManagerConfig GetConfig()
{
// 获取当前项目的程序集
Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = null;
try
{
// 获取程序集中所有的资源名
string [] strNames = assembly.GetManifestResourceNames();
foreach (string strName in strNames)
{
// 这里的处理和我的具体项目有关,NAnt和VS编译出来的嵌入资源文件命名空间不一样
// 因为项目需要,所以把配置文件嵌入到程序集中了。可以对程序代码做一些修改,采用标准的从配置文件中获取
// 配置信息读取类ExSectionHandler没有作修改,依然可以作为.NET的标准配置信息读取支持类
if(strName == "ZTE.PDM.PUB.Util.ExManagementConfig.Xml" || strName == "ExManagementConfig.Xml")
{
stream = assembly.GetManifestResourceStream(strName);
}
}
}
catch(Exception ex)
{
throw ex;
}
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(stream);
ExSectionHandler handler = new ExSectionHandler();
return handler.Create(null, null, xmlDoc.SelectSingleNode("/ExManager")) as ExManagerConfig;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -