⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exmanager.cs

📁 异常处理包,通用 异常处理包,通用 异常处理包,通用
💻 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 + -