C#异常-使“源错误”成为调用方法的行

时间:2018-12-07 18:49:59

标签: c# exception error-handling

在C#中,如果我调用一个固定方法(如Regex.Replace)并引发异常,则错误消息将标记该方法的调用行,如下所示:

方法调用:

//
//
string str = Regex.Replace("Hello", null, "");
//
//

enter image description here

但是,如果我编写自己的方法(如MyRegex.MyReplace)并引发异常,则错误消息会标记引发异常的行:

public static class MyRegex
{
    public static string MyReplace(string input, string pattern, string replacement)
    {
        if (pattern == null)
        {
            throw new Exception("Pattern must not be null.");
        }
        else
        {
            return Regex.Replace(input, pattern, replacement);
        }
    }
}

方法调用:

//
//
string str = MyRegex.MyReplace("Hello", null, "");
//
//

enter image description here

我如何在方法中引发异常,并在调用方法的位置(如固定方法)加上错误消息标记,而不是在引发异常的位置标记错误消息?

1 个答案:

答案 0 :(得分:2)

显示的行是调用堆栈中可获得源代码的最低点。

您在Regex.Replace中看不到任何代码,因此它仅向您显示代码中您调用它的那一行。

但是由于throw new Exception()是您的代码,因此它就是显示的内容。

如果您构建了一个DLL并将其用于另一个项目(并且未复制.pdb文件),则其行为与您的Regex.Replace示例相同,因为新项目看不到源代码DLL中的代码。

但是,如果您复制.pdb文件并在DLL源代码所在的同一台计算机上运行新项目,则Visual Studio 可以知道在哪里可以找到源代码,并且它仍然会向您显示DLL代码中的异常。 (至少,我知道Visual Studio会以这种方式运行-我不确定ASP.NET是否会将其显示在浏览器中)