shell
не выбрасывает Exception
до тех пор, пока sink
.
Блок try
, содержащий только shell
, полностью выполняется без исключения.будучи брошенным, возвращает последнее значение в блоке, которое затем западает вне контекста try
, который затем выбрасывает Exception
.
. Вы можете увидеть это с помощью:
put "start";
try {
shell "./prog.sh";
'something';
}
put "end";
Теперь оболочка погружается в try
, который попадает в неявное CATCH
из try
.Блок try
возвращает последнее значение в блоке, «что-то», которое затем безопасно удаляется за пределы try
.
. Вы также можете заставить sink
произойти внутри try
:
put "start";
try {
sink shell "./prog.sh"
}
put "end";
Ваш добавленный блок CATCH
просто препятствует тому, чтобы блок try
возвращал возвращаемое значение из shell
.
Вы можете изменить их расположение и увидеть, чтоэто все еще взрывается:
put "start";
try {
CATCH { default {} }
shell "./prog.sh";
}
put "end";
Лучший, самый ясный способ справиться с этим ИМХО - это проверить возвращение из оболочки самостоятельно, а не дать ему опуститься и выдать исключение:
put "start";
if shell "./prog.sh" {
say 'ok'
}
else {
say 'failed'
}
put "end";