.net中的异常处理

本文关键字:异常处理 net | 更新日期: 2023-09-27 18:00:00

我捕获了一个异常,在捕获它之后,我必须附加方法名,这样我就可以知道错误来自哪个方法,然后将它抛出到另一个函数并将其保存在数据库中。

try
{
}
catch (Exception ex)
{
    string strError = ex.Message.ToString() + "methodname:getNoOfRecordsForBatchProcess";
    throw strError.ToString();
}  

但它给了我一个错误,你不能使用字符串变量抛出异常。抛出异常只用于系统异常。有什么方法可以处理这个错误吗。

.net中的异常处理

方法名称在Exception.StackTrace属性中也可见。

顺便说一句,您可以使用StackFrame类以其他方式恢复其名称,例如:

        private static string GetCallingMethodName()
        {
            const int iCallDeepness = 2; //DEEPNESS VALUE, MAY CHANGE IT BASED ON YOUR NEEDS
            System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(false);
            System.Diagnostics.StackFrame sframe = stack.GetFrame(iCallDeepness);
            return sframe.GetMethod().Name;
        }

问题的答案

throw new Exception(strError);

(然而,正如其他人所说,这可能不是处理此问题的最佳方式。)

How可能重复获取导致异常的方法的名称。

catch (Exception ex)
{
   MethodBase site = ex.TargetSite;
   string methodName = site == null ? null : site.Name;
   ...           
}

捕获并重新引发异常时,"建议"创建一个带有有意义的错误消息的新异常,并将原始异常作为内部异常传入。

例如:

catch(Exception ex)
{
  const string message = "Some error message.";
  throw new MeaningfulException(message, ex);
}

我也会选择StackFrame。我发布了@Tigran答案的扩展(因为你要求在try{...}catch{...}块中更明确的用法),所以如果这有助于你理解用法,请接受他的答案,而不是我的答案:

try
{
    int a = 0;
    var r = 1 / a;
}
catch (Exception ex)
{
    throw new Exception(
        String.Format("{0} Method name: {1}",
            ex.Message,
            GetCallingMethodName()),
        ex);
}

GetCallingMethodName:

private static string GetCallingMethodName()
{
    const int iCallDeepness = 1; //DEEPNESS VALUE, MAY CHANGE IT BASED ON YOUR NEEDS
    System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(false);
    System.Diagnostics.StackFrame sframe = stack.GetFrame(iCallDeepness);
    return sframe.GetMethod().Name;
}

p.S.@Tigran,如果你认为不需要这个答案,我会删除它。