perl6 – 在Perl 6中捕获shell命令的异常
发布时间:2020-12-15 21:49:37 所属栏目:大数据 来源:网络整理
导读:我不得不运行一个 shell程序退出并出现Perl 6的错误,所以我决定测试它是如何工作的. 我做了一个bash脚本产生一个错误,从Perl 6程序运行它: $cat prog.sh echo "error" 2exit 1 以下是我从Perl 6中调用它的方法: put "start"; try { shell "./prog.sh"; }pu
我不得不运行一个
shell程序退出并出现Perl 6的错误,所以我决定测试它是如何工作的.
我做了一个bash脚本产生一个错误,从Perl 6程序运行它: $cat prog.sh echo "error" >&2 exit 1 以下是我从Perl 6中调用它的方法: put "start"; try { shell "./prog.sh"; } put "end"; 输出显示程序在运行shell命令后退出. 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 所以我的问题是:为什么有必要添加CATCH块,而尝试单独无法解决错误? 解决方法
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"; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |