加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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";

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读