2014-12-04 83 views
0

t.ms文件包含:如何在断言失败时使非交互式Maple退出?

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 

也就是说,我想枫与在第一次失败的断言非零退出状态退出。 (我不在乎退出代码是否为1或其他任何东西,只要它不为零。我从documentation得到了4,与错误中断有关)我如何得到这个结果?

+0

“1”的退出码意味着枫树未能初始化/启动。你为什么要使用它?退出代码将报告给操作系统,以确定*为什么*枫关闭。在你的例子中,枫树正在运行并正确关闭。 [看起来你可以用'quit(n)','done(n)'或者'stop(n)'来返回你自己的,但是。](http://www.maplesoft.com/support/help/maple /view.aspx?path=maple) – admdrew 2014-12-04 16:03:51

+1

通过使用'-e 2'选项,您可以在第一个未被捕获的错误(在这种情况下由第一个失败的断言引起)退出。 – acer 2014-12-04 16:17:16

+0

@acer:感谢'-e 2'。它确实导致提前退出,但是退出代码为0。我更新了我的问题以反映这一点。如何通过非零退出代码获得提前退出? – pts 2014-12-04 20:30:23

回答

2

的文档不会使它很清楚,必须使用,

`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使用华普18.01为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: 
+0

太棒了,谢谢!你可以添加更多的参数到'handler'来显示一个自定义的错误信息,类似于'ASSERT(1 <1,(2,3,[4,5],“foo”))'显示的内容吗? – pts 2014-12-04 22:21:38

+0

我做了一个修改,用于额外的参数。 – acer 2014-12-05 01:34:42