perl6 – 在Perl 6中捕获shell命令的异常

前端之家收集整理的这篇文章主要介绍了perl6 – 在Perl 6中捕获shell命令的异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我不得不运行一个 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";
原文链接:https://www.f2er.com/Perl/172228.html

猜你在找的Perl相关文章