首页 > 解决方案 > C# 异常 - 使“源错误”成为调用方法的行

问题描述

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

方法调用:

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

在此处输入图像描述

但是,如果我编写自己的方法(如 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, "");
//
//

在此处输入图像描述

如何在方法中抛出异常,并在调用方法的位置(如罐头方法)而不是抛出异常的位置标记错误消息?

标签: c#exceptionerror-handling

解决方案


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

你看不到里面的任何代码Regex.Replace,所以它只显示你在代码中调用它的那一行。

但是因为throw new Exception()是您的代码,所以它显示了。

如果您构建了一个 DLL 并在另一个项目中使用它(并且没有复制 .pdb 文件),那么它的行为方式与您的Regex.Replace示例相同,因为新项目无法看到 DLL 中的源代码。

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


推荐阅读