.net中的异常处理
本文关键字:异常处理 net | 更新日期: 2023-09-27 18:00:00
我捕获了一个异常,在捕获它之后,我必须附加方法名,这样我就可以知道错误来自哪个方法,然后将它抛出到另一个函数并将其保存在数据库中。
try
{
}
catch (Exception ex)
{
string strError = ex.Message.ToString() + "methodname:getNoOfRecordsForBatchProcess";
throw strError.ToString();
}
但它给了我一个错误,你不能使用字符串变量抛出异常。抛出异常只用于系统异常。有什么方法可以处理这个错误吗。
方法名称在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,如果你认为不需要这个答案,我会删除它。