我们怎样才能轻松地找到代码中哪一行导致了运行时异常呢?

2024-05-03

考虑以下分析器:

public void AnalyzeNode(SyntaxNode node, SemanticModel semanticModel, Action<Diagnostic> addDiagnostic, CancellationToken cancellationToken)
{
    var throwStatement = node as ThrowStatementSyntax;

    var isObjectCreationExpression = throwStatement.Expression is ObjectCreationExpressionSyntax;
    var obj = throwStatement.Expression as ObjectCreationExpressionSyntax;

    var isCorrectTypeOfExpression = (obj.Type as IdentifierNameSyntax).Identifier.Text == typeof(ArgumentException).Name;
}

With SyntaxKind.ThrowStatement作为兴趣类型。

obj应该null如果抛出的异常尚未在表单中声明new Exception()但更确切地说是呈现为throw e where e是先前声明的异常。

这反过来会抛出一个NullReferenceException when obj.Type之后立即调用。

有问题的示例:

static void Method1()
{
    throw new ArgumentException();
}

static void Method2(ArgumentException e)
{
    throw e;
}

首先throw会很好地通过分析仪,但第二个会导致obj to be null因为它不是类型ObjectCreationExpressionSyntax.

在沙盒 Visual Studio 环境中,这将显示为信息消息:

用户诊断分析器“FormattingFixes.EmptyArgumentException.ArgumentExceptionAnalyzer”引发异常,并显示消息“对象引用未设置到对象的实例。”。

在这个简短的示例中,很容易看出问题出在哪里,但在一个不那么做作的示例中,将很难发现问题。行和列都是1,没有帮助。

在“传统”编程中,您的环境会自动显示抛出运行时异常的位置以及该时间点的值。我可以在代码中的某个位置放置一个随机断点,每次命中时查看所有值并尝试从那里推断出它,但是一旦节点数量远高于这两个值,这种方法就无法很好地扩展。

我们怎样才能轻松地找到代码中哪一行导致了运行时异常呢?


所以你应该仍然可以闯入,但如果你没有检查一些事情:

转到“调试”菜单下,然后选择“异常”。您将看到“已抛出”或“用户未处理”列。使用 Find 查找 NullReferenceException,然后选中“抛出”复选框。一旦抛出 NullReferenceException,这将导致 VS 中断。如果你想真正具有侵略性,你可以告诉它在所有异常情况下中断。

如果仍然不起作用,请转到“工具”>“选项”、“调试”、“常规”并清除“仅我的代码”。这里需要注意的是这将会继续all例外情况,包括 VS 中那些甚至不是你的错的部分。 (遗憾的是,我们在很多不同的地方抛出了很多异常。)

如果您愿意,请随时提交错误 http://roslyn.codeplex.com/因此我们可以使消息包含堆栈跟踪和行/列,以便更容易调试。

既然我在这里:你的代码做到了

var isCorrectTypeOfExpression = (obj.Type as IdentifierNameSyntax).Identifier.Text == typeof(ArgumentException).Name;

小心语法检查——如果我写会发生什么throw new System.ArgumentException()?正确的方法是获取语义模型并绑定 ObjectCreationExpression 以找出真正的类型是什么。 (如果你关心的话,这也意味着你可以在别名的情况下工作。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们怎样才能轻松地找到代码中哪一行导致了运行时异常呢? 的相关文章

随机推荐

  • 滚动 swiftUI 列表时,未调用单元格的任务修改器。怎么修?

    我写了一个异步图像视图 with swiftui 并在列表单元格中使用 AsyncImgView 使用任务修饰符在 Img 出现时从缓存或网络下载 Img 在 iOS16 之前一切正常 但在iOS16我发现当我滚动列表新细胞的AsyncIm
  • OTP(令牌)应自动从消息中读取

    我正在开发一个 Android 应用程序 其中服务器发送 OTP 用户需要在应用程序中输入此 OTP 才能注册我的应用程序 我想要的是 我的应用程序应该能够自动读取服务器发送的 OTP 我怎样才能实现这个目标 在这方面的任何帮助或指导将不胜
  • 在 ng-repeat 中使用 bootstrap popover

    我有一个引导程序弹出窗口 它在有角度的外部工作ng repeat a href class tt1 Hover over me a 一旦我在 ng repeat 中使用它 它就会停止工作 我在角度控制器构造函数中初始化弹出窗口 tt1 po
  • Ansible 循环直到条件匹配。

    我想进行一系列 API 调用 每次调用后检查结果中的特定参数 如果它大于特定值 则将其保存在寄存器中并继续进一步执行剧本 基本上 我正在对 RHEV 进行 API 调用来检查存储域 然后我想检查存储域是否有足够的空间 如果有 则将该存储域i
  • 如何在 Visual Studio 中打开 .rdl 文件?

    我有一个 rdl 文件 需要在 Visual Studio 中打开 当我尝试打开该文件时 我得到了一个 XML 文件 但是 我无法看到设计器格式 我不知道使用哪个版本的 Visual Studio 创建此 rdl 文件 是否可以在 Visu
  • 如何引导用户为我的应用程序启用辅助功能服务

    我知道不可能以编程方式启用应用程序的辅助功能服务 因此我想将用户引导至此屏幕 System settings gt Accessibility gt app name gt enable disable screen 那可能吗 您可以将它们
  • Java中使用JsonPath解析JSON

    我是 Json Path 的新手 我已将 json path 0 8 0 jar 添加到我的 Eclipse 构建路径中 我从以下位置复制了 JSON http code google com p json path http code g
  • Logback 附加程序将消息作为 HTTP 消息发布

    根据我的要求 我只想将 HTTP 消息发布到另一端 该消息由org slf4j LoggerFactory getLogger 以下 JSON 字符串记录在INFO level studentName My Name Deratment C
  • SwiftUI 检测按下删除按钮

    我正在使用 SwiftUI 但我正在编写自己的自定义文本掩码 但当用户按 删除 键时我需要删除 我正在使用onChange方法 但它不检测何时按下特殊键 目前我正在使用 TextField self placeholder text sel
  • 您可以将 window.location 设置为带有 chrome:// 的页面吗?

    我正在尝试将用户重定向到chrome settings 或者这实际上可以是带有chrome 前缀 但是window location chrome settings or window location chrome crash 不工作 有
  • 参数化单元测试套件

    我正在尝试设置一些参数化测试套件 不幸的是到目前为止还没有任何运气 我有两组参数 我想使用所有可能的组合运行多个测试用例 它们位于不同的类中 我尝试使用 JUnit4 来完成此操作 但无法正确设置 这将是我的基本想法 TestSuite1
  • 使用CefSharp捕获资源响应数据(正文)

    我正在尝试使用 CefSharp 访问 URL 并捕获在加载给定页面期间检索到的特定资源 大概作为每个资源的流或字节数组 CefSharp提供了IRequestHandler接口 您可以创建一个实现此接口的类来响应请求 响应事件 但它不以任
  • 为什么“git diff”在“git add”之后报告没有文件更改

    这是为什么git diff认为没有变化 即使git status将它们报告为modified git status On branch master Your branch is ahead of origin master by 2 co
  • ES6 模块与 HTML 导入

    HTML 导入 http www w3 org TR 2013 WD html imports 20130514 是的一部分网络组件 http www w3 org TR components intro 规范并提供一种处理 Web 依赖性
  • 有没有一种简单的方法可以知道哪些文件将在下一个“git pull”中更新?

    我想知道如果我执行 git pull 哪些文件将被更新 以及希望发生的更改 is git stash git fetch git diff origin master git stash apply 答案 See here http ker
  • 所需的最少攻击次数[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们有一个二维的细胞网格 每个细胞可能包含也可能不包含怪物 我们得到了包含怪物的单元格列表 在一次攻击中 我们可以杀死所有排成一排或一列的
  • 用 pandas 计算前滚平均值

    我需要计算数据框中的一些前滚平均值 但真的不知道从哪里开始 我知道如果我想提前 10 天选择一个小区 我会这么做df shift 10 但我想做的是计算提前 10 到 15 天之间的平均值 所以我的想法是df rolling 10 15 m
  • INNER JOIN 与 INNER JOIN (SELECT . FROM)

    同一查询的这两个版本之间的性能有什么区别吗 Version 1 SELECT p Name s OrderQty FROM Product p INNER JOIN SalesOrderDetail s on p ProductID s P
  • 实体框架中的新对象 - 主键问题

    在我的数据库中我有一个Vehicle带有主键的表 我正在创建一个新的Vehicle对象使用 new Vehicle 并适当更新车辆的属性 当我尝试做一个 genesisContext Vehicles AddObject vehicle 第
  • 我们怎样才能轻松地找到代码中哪一行导致了运行时异常呢?

    考虑以下分析器 public void AnalyzeNode SyntaxNode node SemanticModel semanticModel Action