【问题标题】:How to make non-interactive Maple exit on assertion failure?如何在断言失败时使非交互式 Maple 退出?
【发布时间】:2014-12-04 15:57:18
【问题描述】:

我的t.ms 文件包含:

interface(prettyprint=0): kernelopts(assertlevel=1):
ASSERT(1<1):
ASSERT(2<2):

当我跑步时:

maple -q t.ms; echo $?

我明白了:

Error, assertion failed
Error, assertion failed
0

当我跑步时:

maple -e 2 -q t.ms; echo $?

我明白了:

Error, assertion failed
0

我想得到:

Error, assertion failed
4

也就是说,我希望 Maple 在第一个失败的断言时以非零退出状态退出。 (我不在乎退出代码是 1 还是其他任何值,只要它不为零即可。我从 documentation 得到数字 4,与 errorbreak 相关)我如何得到它?

【问题讨论】:

  • 1 的退出代码表示 maple 无法初始化/启动。为什么要使用它?退出代码将向操作系统报告以确定 为什么 maple 关闭。在您的示例中,枫树正在正确运行和关闭。 Looks like you can return your own with quit(n), done(n), or stop(n), though.
  • 您可以使用-e 2 选项让 maple 在第一个未捕获的错误(在这种情况下由第一个失败的断言引起)时退出。
  • @acer:感谢-e 2。它确实会导致提前退出,但退出代码为 0。我已经更新了我的问题以反映这一点。如何使用非零退出代码提前退出?
  • @admdrew:我不关心实际的退出代码,只要它不为零。我想要非零的原因是为了让调用进程可以轻松区分 Maple 是否已成功运行端到端命令(0 退出代码),或者是否存在任何失败(非零退出代码),包括断言失败。
  • @pts 你需要ASSERT吗?你可以 try/catch 代替你的条件,并在失败时触发 quit(4) 吗?

标签: assert exit-code maple


【解决方案1】:

文档并没有明确说明必须使用,

`quit`(n)

带有名称引号。

interface(prettyprint=0):

handler:=proc(e::uneval)
  local failed;
  printf("entered\n"); # remove this when satisfied
  failed:=false;
  try
    if evalb(eval(e)) <> true then
      error;
    end if;;
  catch:
    failed:=true;
    printf("Error, assertion failed\n");
  finally;
    if failed then
       `quit`(5);
    end if;
  end try;
  true;
end proc:

ASSERT( handler( 1<1 )):
ASSERT( handler( 2<2 )):

现在,将其保存为文件 uh.mpl,然后使用 Maple 18.01 for Linux,我看到了,

$ maple18.01 -q -A 2 ~/uh.mpl ; echo $?
entered
Error, assertion failed
5

如果在没有 -A 2 的情况下运行,则不会运行断言检查。

[已编辑] 下面是一个轻微的修改,用于处理附加参数作为打印的一部分。

handler:=proc(e::uneval)
  local failed;
  printf("entered\n"); # remove this when satisfied
  failed:=false;
  try
    if evalb(eval(e)) <> true then
      error;
    end if;;
  catch:
  failed:=true;
  printf("Error, assertion failed, %q\n", _rest);
  finally;
  if failed then
     `quit`(5);
  end if;
  end try;
  true;
end proc:

【讨论】:

  • 太棒了,谢谢!您能否向handler 添加更多参数以显示自定义错误消息,类似于ASSERT(1&lt;1, (2, 3, [4, 5], "foo")) 显示的内容?
  • 我做了一个修改,以获得额外的参数。
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 2011-08-31
  • 2017-11-21
  • 2018-06-02
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多