Как я могу проверить, что команда Tcl не выдавала исключение или ошибку? - PullRequest
4 голосов
/ 08 сентября 2011

У меня есть следующая процедура:

proc myexec { args } {
    info_msg "Executing shell command: $args"

    set catch_res [catch  {eval exec $args} res]

    if { $catch_res != 0 } {
        error_msg "Failed in command: $args"
        error_msg "$res"
    }

    return $catch_res
}

Он проверяет только команды Unix и не работает с командами Tcl.Как я могу изменить эту процедуру, чтобы она работала с командами Tcl?

Например, если я хочу проверить, что следующие команды оцениваются без ошибок:

set object1 $object2

или

open $filename r

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Самый простой способ сделать это:

proc myeval { args } {
    info_msg "Executing Tcl command: $args"

    set catch_res [catch $args res]

    if { $catch_res != 0 } {
        error_msg "Failed in command: $args"
        error_msg "$res"
    }

    return $res
}

Здесь мы заменили catch {eval exec $args} res на catch $args res (плюс некоторые косметические вещи), что приведет к оценке аргументов как скрипта без дальнейшей замены .Вы бы использовали это так:

myeval foo bar $boo

В качестве альтернативы, если вы после выполнения подстановок и в catch, вам лучше написать эту более сложную версию:

proc myeval { script } {
    info_msg "Executing Tcl command: [string trim $script]"

    set catch_res [catch [list uplevel 1 $script] res]

    if { $catch_res != 0 } {
        error_msg "Failed in command: [string trim $script]"
        error_msg "$res"
    }

    return $res
}

В этом случае вы бы назвали это так:

myeval {
    foo bar $boo
}
1 голос
/ 08 сентября 2011

Если вы просто хотите изменить эту процедуру, чтобы она выполняла аргументы, передаваемые как команда Tcl, а не как команда Unix, просто отбросьте exec , т.е. вместо eval exec $args просто сделайте eval $args.

Сделать одну процедуру для обеих команд Tcl и Unix сложнее, но Tcl уже делает это для команд, которые вы вводите в tclsh или хотите - сначала она ищет встроенную команду, а если она не находит, то пытается запустить его как команду Unix. Вы можете включить это поведение в скрипте, выполнив set ::tcl_interactive 1 - подробнее на Tcl Wiki

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