【问题标题】:How to make a NuGet thrown exception appear at the method call?如何让 NuGet 抛出的异常出现在方法调用中?
【发布时间】:2021-07-27 02:25:50
【问题描述】:

当您在编码时遇到如下错误,您会在尝试错误的代码行收到错误。

File.ReadAllText("nonexistent_file.txt");

作为参考,在 Visual Studio 社区中,这看起来像这样: Normal unhandled exception

但是,我正在设计一个 NuGet 包(如 DLL),如果用户尝试将无效字符串传递给函数,有时我想抛出异常,如 ArgumentException。但是,当我将其编码到 NuGet 中,然后继续使用无效字符串时,异常会将我带到我的 NuGet 中我抛出异常的代码行,而不是我尝试错误的代码行。

例如:NuGet thrown exception

我很好奇为什么 Visual Studio 将我带到 NuGet 代码中的函数,而不是我进行无效调用的地方。知道我在这里做错了什么吗?

【问题讨论】:

  • 嗯,也许可以试试DebuggerStepThrough?或者可能是DebuggerHidden
  • 你的机器上有你的的源代码。所以调试器可以毫无问题地显示抛出位置。对于使用 Nuget 检索该库的任何人来说,通常情况并非如此,调试器除了遍历堆栈以查找它确实具有源代码的语句外,什么也做不了。因此,他们将在呼叫位置看到异常。功能,而不是错误。

标签: c# visual-studio exception nuget


【解决方案1】:

如果 VisualStudio 可以找到您的 dll(.pdb 文件)的符号,并且如果它可以找到与符号匹配的源代码,并且您没有打开“仅我的代码”,它会尽力直接跳转到那个抛出异常的地方。

如果您没有在 NuGet 包中包含 pdb 文件(您可能没有),那么您看到的效果只会出现在您作为 NuGet 包的原始开发者的情况下,但是不给别人。

或者你引用的是项目而不是包,我在你的问题中看不到。

【讨论】:

    【解决方案2】:

    您的 nuget 包是引发异常的地方,因此代码会中断并且 VS 会跳转到。如果要在调用 nuget 包中方法的方法内中断,则需要处理异常并重新抛出它。

    try {
      DoSomethingInMyNugetPackage();
    } catch(TheNugetException ex) {
      throw; // <<< code will now break here with the same exception, rather than inside the nuget package
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 2012-11-22
      • 2011-10-22
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多