在ksh中嵌套异常处理(set -e)

时间:2017-05-28 10:33:57

标签: exception-handling nested ksh

我希望我的ksh脚本在意外错误时停止。我还使用嵌套的函数来重用循环代码。

所以我使用了errexit功能(' set -e')。该脚本在出错时崩溃 - >大。

我有时想抓住错误而不是崩溃。

我有一个函数func。我想要(要求):

    函数中的
  • :它应该在出错时停止

  • 父母中的
  • :它也应该在出错时停止

  • 除了在父母中执行'功能'应该被抓住

我编码了这个:

# parent script

func()
  { (
  set -e   # function should crash on 1st error
  rm foo ;  rm foo  # this will trigger error
  echo "Since -e is set, this part of the script should never get reached"
  ) }


set -e  # parent script should crash on 1st error

echo "do stuff"

# we want to execute 'function' and catch error
if func ; then
  echo "Execution of func was ok"
else
  echo "Execution of func was not ok"
fi

echo "do more stuff"

它不起作用。

do stuff
rm: impossible de supprimer 'foo': No such file or directory
rm: impossible de supprimer 'foo': No such file or directory
Since -e is set, this part of the script should never get reached
Execution of func was ok
do more stuff

因为' func'在测试中执行(如果是func),则禁用errexit。这意味着func中的错误不会使函数崩溃。该功能以状态0继续并退出,并且不会通知父级错误。即使我在func中再次明确设置了errexit,也没有启用errexit。

如果我没有在测试中执行func,那么errexit就会启动并且父进程崩溃:我无法捕获异常(换句话说:I' m func' ed)。我可以在func的调用下临时禁用errexit,但这似乎是一个不干净的解决方法。

知道如何达到我的要求吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试在“set -e”(包含引号)上运行搜索?

或者也许是谷歌搜索,例如:ksh“set -e”site:stackoverflow.com

......几个点击/匹配/建议答案。