详谈.NET的异常处理

2019-05-26 01:18:35于海丽

(2).验证异常:

 /// <summary>
 /// 检查字符串是空的或空的,并抛出一个异常
 /// </summary>
 /// <param name="val">值测试</param>
 /// <param name="paramName">参数检查名称</param>
 public static void CheckNullOrEmpty(string val, string paramName)
 {
  if (string.IsNullOrEmpty(val))
  throw new ArgumentNullException(paramName, "Value can't be null or empty");
 }
 /// <summary>
 /// 请检查参数不是空的或空的,并抛出异常
 /// </summary>
 /// <param name="param">检查值</param>
 /// <param name="paramName">参数名称</param>
 public static void CheckNullParam(string param, string paramName)
 {
  if (string.IsNullOrEmpty(param))
  throw new ArgumentNullException(paramName, paramName + " can't be neither null nor empty");
 }
 /// <summary>
 /// 检查参数不是无效,并抛出一个异常
 /// </summary>
 /// <param name="param">检查值</param>
 /// <param name="paramName">参数名称</param>
 public static void CheckNullParam(object param, string paramName)
 {
  if (param == null)
  throw new ArgumentNullException(paramName, paramName + " can't be null");
 }
 /// <summary>
 /// 请检查参数1不同于参数2
 /// </summary>
 /// <param name="param1">值1测试</param>
 /// <param name="param1Name">name of value 1</param>
 /// <param name="param2">value 2 to test</param>
 /// <param name="param2Name">name of vlaue 2</param>
 public static void CheckDifferentsParams(object param1, string param1Name, object param2, string param2Name)
 {
  if (param1 == param2) {
  throw new ArgumentException(param1Name + " can't be the same as " + param2Name,
   param1Name + " and " + param2Name);
  }
 }
 /// <summary>
 /// 检查一个整数值是正的(0或更大)
 /// </summary>
 /// <param name="val">整数测试</param>
 public static void PositiveValue(int val)
 {
  if (val < 0)
  throw new ArgumentException("The value must be greater than or equal to 0.");
 }

(3).Try-Catch扩展操作:

/// <summary>
 /// 对某对象执行指定功能与后续功能,并处理异常情况
 /// </summary>
 /// <typeparam name="T">对象类型</typeparam>
 /// <param name="source">值</param>
 /// <param name="action">要对值执行的主功能代码</param>
 /// <param name="failureAction">catch中的功能代码</param>
 /// <param name="successAction">主功能代码成功后执行的功能代码</param>
 /// <returns>主功能代码是否顺利执行</returns>
 public static bool TryCatch<T>(this T source, Action<T> action, Action<Exception> failureAction,
  Action<T> successAction) where T : class
 {
  bool result;
  try
  {
  action(source);
  successAction(source);
  result = true;
  }
  catch (Exception obj)
  {
  failureAction(obj);
  result = false;
  }
  return result;
 }
 /// <summary>
 /// 对某对象执行指定功能,并处理异常情况
 /// </summary>
 /// <typeparam name="T">对象类型</typeparam>
 /// <param name="source">值</param>
 /// <param name="action">要对值执行的主功能代码</param>
 /// <param name="failureAction">catch中的功能代码</param>
 /// <returns>主功能代码是否顺利执行</returns>
 public static bool TryCatch<T>(this T source, Action<T> action, Action<Exception> failureAction) where T : class
 {
  return source.TryCatch(action,
  failureAction,
  obj => { });
 }
 /// <summary>
 /// 对某对象执行指定功能,并处理异常情况与返回值
 /// </summary>
 /// <typeparam name="T">对象类型</typeparam>
 /// <typeparam name="TResult">返回值类型</typeparam>
 /// <param name="source">值</param>
 /// <param name="func">要对值执行的主功能代码</param>
 /// <param name="failureAction">catch中的功能代码</param>
 /// <param name="successAction">主功能代码成功后执行的功能代码</param>
 /// <returns>功能代码的返回值,如果出现异常,则返回对象类型的默认值</returns>
 public static TResult TryCatch<T, TResult>(this T source, Func<T, TResult> func, Action<Exception> failureAction,
  Action<T> successAction)
  where T : class
 {
  TResult result;
  try
  {
  var u = func(source);
  successAction(source);
  result = u;
  }
  catch (Exception obj)
  {
  failureAction(obj);
  result = default(TResult);
  }
  return result;
 }
 /// <summary>
 /// 对某对象执行指定功能,并处理异常情况与返回值
 /// </summary>
 /// <typeparam name="T">对象类型</typeparam>
 /// <typeparam name="TResult">返回值类型</typeparam>
 /// <param name="source">值</param>
 /// <param name="func">要对值执行的主功能代码</param>
 /// <param name="failureAction">catch中的功能代码</param>
 /// <returns>功能代码的返回值,如果出现异常,则返回对象类型的默认值</returns>
 public static TResult TryCatch<T, TResult>(this T source, Func<T, TResult> func, Action<Exception> failureAction)
  where T : class
 {
  return source.TryCatch(func,
  failureAction,
  obj => { });
 }