📄 defaultexhandler.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 + -