Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 函数引发的异常,其中该函数在引发异常时调用_C#_Function_Exception - Fatal编程技术网

C# 函数引发的异常,其中该函数在引发异常时调用

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多个引用 当它抛

我有一个函数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多个引用

当它抛出异常时,我想知道它最后一次调用的引用是什么。当异常发生时? 请帮助我在不更改函数参数的情况下解决此问题

我想知道它最后一次调用的引用是什么。当出现异常时 发生了什么

然后检查异常堆栈跟踪,这将让您知道整个调用堆栈以及负责异常的最新调用堆栈。还有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-我在回答中添加了一些注释和参考。