问题标签 [error-recovery]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
544 浏览

kubernetes - Kubernetes StatefulSet pod 启动错误恢复

如果您在 StatefulSet 规范中修补镜像名称,Kubernetes StatefulSet (v1.8) 将自动将其管理的 pod 滚动到新镜像——毕竟,编排这种更新是它的主要工作之一。但是,如果在镜像拉取步骤中部署修改后的镜像失败(例如,镜像名称中有错字,所以没有要拉取的镜像),它尝试使用新镜像重新启动的第一个 pod 会卡在ImagePullBackOff 状态和翻转停止。没关系,这几乎是您想要和期望的。但是,如果您随后再次修补 StatefulSet 规范以纠正错误,则该 set 不会被修复 - 它只是处于损坏状态 - 直到您(手动)删除失败的 pod,此时一切都按原样进行一切都恢复到健康状态。

我认为应该有一种配置方法,以便在更新映像名称时自动进行这种恢复,就像正常部署一样,而不是需要手动干预(尤其是因为这是针对 CI-类型应用程序,无论如何这一切都需要自动化)。我不禁觉得我只是没有在文档中找到正确的选项,但是仔细研究文档并进行无休止的 Google 搜索并没有发现成功的秘诀。有没有办法将这种恢复配置为自动发生,如果是这样,它是什么?

如果做不到这一点,是否有一种优雅的方法可以自动检测故障状态以触发对故障 pod 的脚本删除?我尝试过的一切似乎都很笨拙,有很多轮询和临时超时,所以我很难相信这是正确的做法。

0 投票
1 回答
327 浏览

javascript - 用于自动分号插入的 Bison 错误恢复

我正在尝试编写一个 Bison C++ 解析器来解析 JavaScript 文件,但我不知道如何使分号成为可选。

至于 ECMAScript 2018 规范(https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf,第 11.9 章),分号实际上不是可选的,而是在解析。在规范中,指出:

当从左到右解析源文本时,遇到任何语法生成都不允许的标记(称为违规标记)时,如果一个或多个以下条件为真:

  • 违规标记与前一个标记至少有一个 LineTerminator[...]

据此,我试图以这种天真的方式解决这个问题:

  • error使用特殊令牌检测错误;
  • 告诉词法分析器在操作期间发生了语法错误;如果在当前标记之前遇到换行符,则词法分析器将在下一次yylex调用时返回一个新的分号标记;在随后的调用中,当语法错误发生时,它将返回先前是有问题的令牌。

我的解析器的一个非常简化的结构如下所示:

但是这样做,如果文件包含一个没有终止分号但有换行符的有效 JavaScript 语句,当遇到违规标记时,解析器会将语句的其余部分缩减为error特殊标记。当我告诉词法分析器语法错误时,解析器已经将error标记减少为stmt_list一个,并且先前的有效指令丢失了,使得分号插入无用。

显然我不想让我的解析器丢弃有效的语句并转到下一个语句。

我怎样才能做到这一点?这是正确的方法还是我错过了什么?

0 投票
1 回答
579 浏览

c++ - Bison 错误恢复(恐慌模式)不起作用?

我一直在阅读有关如何使 Bison 解析“抗错”的信息,这似乎很简单。无论我在哪里看,它几乎都归结为相同的简单解决方案

然而,我无法让它工作,我看不到缺陷。解析器不断停止/退出而不是继续/恢复......

我所拥有的基本上是处理所有keywords(及其模式)的规则,例如:

在它之上,我有我的file迭代器规则:

我遇到的问题是,有时关键字以未处理的模式使用,但这不是问题,因为我们不想捕获这些情况(只想忽略它们)。例如:

  • 我们捕捉到模式:

    KEY1 NAME KEY2 VALUE

  • 我们想忽略:

    KEY1 NAME KEY3 KEY2 VALUE

    或者

    KEY2 VALUE(KEY2 前面没有 KEY1)

在这些我们想忽略的情况下,解析器正确地启动了“意外令牌”错误。在上面的示例中,错误将是"Parse error: syntax error, unexpected KEY3"(或"Parse error: syntax error, unexpected KEY2")。

所以从我所见,我认为解决方案就像使用error令牌一样简单,如下所示:

我也试过*:

*并且还尝试过:error '\n'error '\n' { yyerrok; }(我在某些情况下看到过)

可悲的是,我的尝试都没有成功……而且我不断收到同样的“意外”错误。我想知道在能够正确使用它之前我是否必须配置一些东西......我注意到我%option nodefault在我的词法分析器文件中有并尝试删除它,但也有相同的结果。

0 投票
1 回答
1216 浏览

javascript - Cypress 和不稳定的 DOM

我正在使用 cypress 对 react 应用程序进行一些 e2e 测试,但在单击元素时遇到问题。

我有这个简单的脚本:

我的问题开始是因为SaveSaved按钮位于页面加载时由于未知原因刷新多次的反应组件内。测试失败,因为有时组件会在按钮上的contains和之间刷新。click

现在解决这个问题的唯一方法是添加你在测试中看到的等待,但我真的很讨厌这个 hack。

我尝试做的第一件事是捕获错误并重试该contains.should.click块,但赛普拉斯不允许这样做(https://docs.cypress.io/guides/core-concepts/conditional-testing.html#Error-Recovery)和最糟糕的是本文提出的解决方法对我不起作用(或者我不知道该怎么做)

我还尝试处理事件(https://docs.cypress.io/api/events/catalog-of-events.html#Uncaught-Exceptions),但我找不到任何可以用来重试的事件代码并继续执行测试。

我试图与开发人员交谈,如果他们能解决刷新问题,但简短的故事是他们不会。最终用户没有意识到组件上的这种刷新,并且没有预算来调查问题。

此外,我正在与开发人员讨论我们是否可以在某处添加一些东西,以表明组件的加载已经完成,但是,这似乎是不可能的。他们不能不承认组件的加载已经完成,因为他们不知道这些刷新来自哪里。

你知道我如何使用 cypress 来处理这种情况吗?

0 投票
0 回答
116 浏览

compiler-construction - 通过合适的例子理解预测解析中错误恢复(恐慌模式)的启发式

我正在阅读Ullman 等人的文本编译器:原理、技术和工具。我在预测解析中遇到了恐慌模式恢复的概念。文本中提到了一些应该遵循的启发式方法。但他们在本文后面给出的例子仅说明了要点(1)(5)启发式方法。

恐慌模式错误恢复基于跳过输入上的符号直到出现所选同步标记集中的标记的想法。其有效性取决于同步集的选择。应该选择这些集合,以便解析器从实践中可能发生的错误中快速恢复。

一些启发式方法如下:

  1. 作为起点,我们可以将所有符号FOLLOW(A)放入 nonterminal 的同步集中A。如果我们跳过标记,直到FOLLOW(A)看到一个元素并从堆栈中弹出A,则解析可能会继续。

  2. FOLLOW(A)仅用作 的同步集是不够的A。例如,如果分号终止语句,如C,则开始语句的关键字可能不会出现在FOLLOW非终结生成表达式的集合中。因此,赋值后缺少分号可能会导致下一条语句开始的关键字被跳过。通常,语言中的结构存在层次结构。例如,表达式出现在语句中,语句出现在块中,等等。我们可以将开始较高结构的符号添加到较低结构的同步集中。例如,我们可以将开始语句的关键字添加到非终结符生成表达式的同步集中。

  3. 如果我们将符号 in 添加FIRST(A)到 nonterminal 的同步集中A,则可以根据输入中A是否出现符号 in来恢复解析FIRST(A)

  4. 如果非终结符可以生成空字符串,则\epsilon可以将产生式推导用作默认值。这样做可能会推迟一些错误检测,但不会导致遗漏错误。这种方法减少了在错误恢复期间必须考虑的非终结符的数量。

  5. 如果堆栈顶部的终端无法匹配,一个简单的想法是弹出终端,发出一条消息说终端已插入,然后继续解析。实际上,这种方法将一个令牌的同步集包含在所有其他令牌中。

一般来说,我无法理解点中所述启发式的含义(4)

谁能给我一个(或多个)点(2), (3) , (4)可能有用的例子。虽然我可以理解除 之外的所有点的含义(4),但由于本书没有说明点 (2)、(3) 和 (4),因此举个例子可以帮助我更好地理解这件事。

0 投票
0 回答
83 浏览

parsing - JCup 中的错误恢复。块末尾缺少分号

我正在使用 JLex 和 JCUP 为本科项目构建 LR(1) 解析器。我选择(可能是错误的)尽可能地模仿 C++ 语法和语义。我已经完成了词法分析和解析,但我在 CUP 中遇到了错误恢复。

您可以认为我的语言的语法是 C++ 的语法,因为我所做的更改在这里不起作用(我认为)。我知道使用以下产品进行错误恢复是很常见的:

Statement ::= error SEMICOLON

但是,使用此解析器无法从块末尾丢失的分号(大括号 { } 包围的代码片段)中恢复。事实上,我找不到解析器从中恢复的方法。由于我无法将最后一条指令视为错误,因此我尝试至少将整个块视为错误。我试过了:

Block ::= LEFTBRACE error RIGHTBRACE

但这给了我一个 Shift-Reduce 冲突。我也试过:

Block ::= error RIGHTBRACE

但错误没有解决。

你能帮助从这个错误中恢复吗?

0 投票
1 回答
43 浏览

parsing - 手动调整 env/stack/semantic 值以实现错误恢复

我正在尝试在这个版本的项目中实现错误恢复(make然后./parse e1.input进行测试)。

鉴于(1e1.input我希望解析器表现得好像它已解析)并构建了一个 AST Paren (Int 1)。因此,我尝试了

但是,它返回了一个错误Invalid_argument("feed: outgoing transition does not exist")

有谁知道为什么会出现这个错误?