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

📄 defaultexhandler.cs

📁 异常处理包,通用 异常处理包,通用 异常处理包,通用
💻 CS
字号:
using System;
using System.Runtime.Serialization;
using ExManagement.Interface;

namespace ExManagement.ExHandler
{
	[Serializable]
	public class CommEx:Exception
	{
		//带错误提示消息构造
		public CommEx(string message) : base(message){}
		
		public CommEx(string message, Exception e) : base(message, e){}

		// 反序列化
		protected CommEx(SerializationInfo info, StreamingContext context) : base(info, context){}
	}

	/// <summary>
	/// 缺省异常处理器类
	/// </summary>
	public class DefaultExHandler:ExHandlerBase
	{
		public DefaultExHandler():base(){}

		/// <summary>
		/// 调用所有的异常记录对象进行异常信息记录
		/// </summary>
		private int LogEx(Exception ex, string strUserId, string strErrorCode, params string [] strExtention)
		{
			int i = 0;
			int [] intResult = new int[lstLogHandler.Count];
			foreach(IExLogHandler exLogHandler in lstLogHandler)
			{
				intResult[i] = exLogHandler.ExLog(ex, strErrorCode, m_ExHandlerConfig.Name, strUserId, strExtention);
				i ++;
			}
			return intResult[0];
		}

		/// <summary>
		/// 实现接口IExLogHandler中的ProcessExeception方法,提供异常处理的方法
		/// </summary>
		/// <param name="ex"></param>
		/// <param name="strUserId"></param>
		/// <param name="strErrorCode"></param>
		/// <param name="strExtention"></param>
		/// <returns></returns>
		public override string ProcessExeception(Exception ex, string strUserId, string strErrorCode, params string [] strExtention)
		{
			int intLogNum = -1;

            // 判断处理的异常是否是已经被处理过的异常,避免重复处理
			bool IsNewException = ex.GetType() != Type.GetType("ExManagement.Handler.CommEx, ZTE.PDM.PUB.Util");

// 若不是调试编译时,则记录日志信息到数据库;若是则不记录
#if !DEBUG
			// 若是还未处理过的异常
			if(IsNewException)
			{
				// 记录异常信息
				intLogNum = LogEx(ex, strUserId, strErrorCode, strExtention);
			}
			else
			{
				// 从包装过的Excepiton对象中去获取异常日志ID
				intLogNum = Convert.ToInt32(ex.Message.Substring(0,ex.Message.IndexOf(":")));
			}
#endif

			// 根据配置中的异常返回方式,决定处理方式
			switch(m_ExHandlerConfig.ReturnMode)
			{
				// 返回类型为错误编码
				case ExManagement.Config.ExReturnMode.ErrorCode:
				{
					return strErrorCode;
				}
				// 返回类型为详细错误信息(友好提示)
				case ExManagement.Config.ExReturnMode.ErrorString:
				{
					// 若不是调试编译时,返回带异常记录ID的友好提示信息
					// 否则,返回Exception.Message和异常定位信息
#if !DEBUG
					return string.Format("{0}:{1}", intLogNum, strErrorCode);
#else
					return ex.Message + "\r\n定位信息:" + ex.StackTrace;
#endif
				}
				// 返回类型为详细异常信息(Exception.Message)
				case ExManagement.Config.ExReturnMode.ExceptionString:
				{
					return ex.Message;
				}

				// 将异常向上抛出
				case ExManagement.Config.ExReturnMode.Exception:
				{
					// 如果是该层自身引发的异常则包装后抛出
					if(IsNewException)
					{
						// 若是非调试编译环境,即是Remoting分布式环境中,无法抛出带有异常定位信息的Exceptiong对象,把异常Message用自定义的异常类包装后抛出
						// 若是调试编译环境,则是非非分布式环境中,可以用自定义异常信息把原异常对象整个包装后抛出(包含异常定位信息等)
#if !DEBUG
						throw new CommEx(string.Format("{0}:{1}层发生异常:{2},{3}", 
							intLogNum, m_ExHandlerConfig.Name, strErrorCode, ex.Message));
#else
						throw new CommEx(string.Format("{0}:{1}层发生异常:{2},{3}", 
							intLogNum, m_ExHandlerConfig.Name, strErrorCode, ex.Message), ex);
#endif
					}
					// 若是捕捉到的是包装后的异常(即上层抛出的)
					else
					{
						throw ex;
					}
				}
				default:
				{
					return null;
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -