我不得不运行一个
shell程序退出并出现Perl 6的错误,所以我决定测试它是如何工作的.
我做了一个bash脚本产生一个错误,从Perl 6程序运行它:
我做了一个bash脚本产生一个错误,从Perl 6程序运行它:
$cat prog.sh echo "error" >&2 exit 1
put "start"; try { shell "./prog.sh"; } put "end";
start error The spawned command './prog.sh' exited unsuccessfully (exit code: 1) in block <unit> at b.p6 line 2
如果我添加一个CATCH块
put "start"; try { shell "./prog.sh"; CATCH { default {} } } put "end";
一切都很好,程序工作到最后一行:
start error end
解决方法
shell在
sink
之前不会抛出异常.
只有shell的try块完全执行而没有抛出异常,返回块中的最后一个值,然后在try的上下文之外沉没,然后抛出异常.
你可以看到这个:
put "start"; try { shell "./prog.sh"; 'something'; } put "end";
现在shell陷入了try,它被try的隐式CATCH捕获. try块返回块中的最后一个值’something’,然后安全地在try之外沉没.
您还可以强制接收器在try中发生:
put "start"; try { sink shell "./prog.sh" } put "end";
您添加的CATCH块只是阻止try块从shell返回返回值.
你可以重新安排它们,看看它仍然会爆炸:
put "start"; try { CATCH { default {} } shell "./prog.sh"; } put "end";
处理这个恕我直言的最好,最清晰的方法是自己检查shell的返回,而不是让它下沉并抛出异常:
put "start"; if shell "./prog.sh" { say 'ok' } else { say 'Failed' } put "end";