-1

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

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

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

4

5 回答 5

5

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

顺便说一句,您可能会依靠其他方法来使用StackFrame Class恢复其名称,例如:

        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;
        }
于 2013-02-19T10:39:31.527 回答
1

回答您的问题

throw new Exception(strError);

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

于 2013-02-19T10:47:50.920 回答
0

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

catch (Exception ex)
{
   MethodBase site = ex.TargetSite;
   string methodName = site == null ? null : site.Name;
   ...           
}
于 2013-02-19T10:42:01.920 回答
0

当捕获和重新抛出异常时,“建议”创建一个新异常,带有有意义的错误消息,并将原始异常作为内部异常传递。

例如:

catch(Exception ex)
{
  const string message = "Some error message.";
  throw new MeaningfulException(message, ex);
}
于 2013-02-19T10:44:11.293 回答
0

我也会去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;
}

PS @Tigran,如果您认为不需要此答案,我将删除此答案。

于 2013-02-19T11:04:01.743 回答