Почему команда TCL CATCH не возвращает ошибку? - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь запустить скомпилированный код для обработки сложных вычислений, необходимых для сценария TCL, который я пишу. Когда я запускаю код, я использую:

if {[catch {exec $cwd/TaubinSmoother &} error_out]} {
    if {[string first "couldn" $error_out] != -1} {
        puts "TaubinSmoother software could not be located."
        exit
    } else {
        puts "$error_out"
    }
}

При выполнении команды exec ошибки, по-видимому, нет, но она действительно генерируется, поскольку среда PATH неправильно настроена для разделяемых библиотек, которые TaubinSmoother должны запускать. Я пытался использовать:

 proc launch {} {
     set error_catch [catch {exec $cwd/TaubinSmoother &} error_out detail]
     return $detail
 }

 set cwd       [file dirname [info script]]
 set error_out launch
 puts "$error_out"

Это тоже не сработало, так как я получил только «запуск», напечатанный на стандартный вывод. Я прочитал TCL, получаю полное сообщение об ошибке в команде catch и больше о catch и return , но ответ на мой вопрос не сработал и примеры на man-страницы не помогли. Как получить реальную ошибку, чтобы вернуться к моему работающему скрипту, чтобы я мог предупредить будущих пользователей о возникших проблемах?

1 Ответ

0 голосов
/ 24 августа 2018

Задача 1

Ваша вторая попытка не удалась в смысле "не соответствует вашим ожиданиям", потому что строка

 set error_out launch

должна выглядеть так:

 set error_out [launch]

Справочная информация:в своем первоначальном виде это присвоение литеральной строки "launch" переменной error_out.Следовательно, это то, что вы видите напечатанным.

Задача 2

Ваш exec работает в фоновом режиме (&).Следовательно, ваш Tcl-скрипт больше не связан с фоновым процессом.exec просто вернется, не сообщая ни о какой (ну, фоновой) ошибке.Лучше использовать проверенный идиома Tcl для проверки фонового процесса, используя open и fileevent:

См. Обнаружение окончания фонового процесса TCL в сценарии TCL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...