C# 函数引发的异常,其中该函数在引发异常时调用
我有一个函数ReturnString:C# 函数引发的异常,其中该函数在引发异常时调用,c#,function,exception,C#,Function,Exception,我有一个函数ReturnString: public static string ReturnString(string sa, string sb) { try { ... ... return "xyz"; } catch (Exception ex) { throw new clsException(ex.Message); } } 它被其他40多个班级和win farms的600多次调用,这意味着它在40多个班级和win farms中有600多个引用 当它抛
public static string ReturnString(string sa, string sb)
{
try
{
...
...
return "xyz";
}
catch (Exception ex)
{
throw new clsException(ex.Message);
}
}
它被其他40多个班级和win farms的600多次调用,这意味着它在40多个班级和win farms中有600多个引用
当它抛出异常时,我想知道它最后一次调用的引用是什么。当异常发生时?
请帮助我在不更改函数参数的情况下解决此问题
我想知道它最后一次调用的引用是什么。当出现异常时
发生了什么
然后检查异常堆栈跟踪,这将让您知道整个调用堆栈以及负责异常的最新调用堆栈。还有innerException属性(如果有)
检查课堂上的文档。它有一个属性StackTrace,您应该检查它
在您的情况下,exception对象应该具有ex.StackTrace
您可能还想从异常对象中获取TargetSite属性值,比如ex.TargetSite您的问题在这里:
throw new clsException(ex.Message);
正如其他人提到的,ex已经在StackTrace属性检查中包含了您想要的信息,以获取更多信息
但是当你抛出一个新的异常时,你只是在抛出消息,而忽略了你想要得到的所有信息
只需在没有新异常的情况下抛出,或者将ex包含为clsException的内部异常。您应该初始化StackTrace类的实例- 然后,获取第一个堆栈帧- 最后,得出该框架的方法库;它的名称属性是您需要的- 试试这个:
public static string ReturnString(string sa, string sb)
{
try
{
//...
//...
return "xyz";
}
catch (Exception ex)
{
StackTrace oStackTrace = new StackTrace();
string sMethodName = oStackTrace.GetFrame(1).GetMethod().Name;
//It's not a good practice to keep only the error message (you may need other exception details later)
throw new clsException(string.Format("{0}: {1}", sMethodName, ex.Message));
}
}
如果您真的想抛出一个新异常,该异常至少包含原始异常作为内部异常。然后看看stacktrace。例如抛出新的clsExceptionex.Message,ex;对于Peter所说的,不要抛出新的异常,您的变量ex中应该包含所有信息,以便在异常发生之前找到调用方法。您可以在其中放置一个记录器,如Log4Net或nLogi。您想知道函数的最后一次调用引用,异常处理不在此范围内query@FC3D如果ex.StackTrace不包含您需要的信息,请向我们展示一个调用该方法的示例代码,以及出现异常时您希望获得的确切信息。不要描述它,为那个例子写下确切的信息。我想知道函数的最后一个调用引用,异常处理不在这里query@FC3D,我就是这么说的。。。你应该检查堆栈跟踪。如果没有,请澄清上次调用我发现stacktrace的Ref是什么意思??e..stacktrace对我来说不起作用,但Orel代码起作用,并返回上次调用的方法名。无需clsException,它是一些自定义异常,需要在某些特定情况下抛出。虽然我被OP的搞糊涂了question@Rahul是的,我也这么认为,这就是为什么我提到返回原始异常作为其自定义类型的InnerException。然而,对我来说,这似乎不是一个好的实践……为什么不使用ex.StackTrace呢?因为ex.StackTrace只是一个字符串,您可能可以在那里找到调用方法的名称,但即使这样,它也可能需要一些解析。我没有试过。另一方面,StackTrace对象保留了更多信息以及调用方法名;o@SirRufo-我在回答中添加了一些注释和参考。