#tcl
#tcl
Вопрос:
Я делаю eval
с содержимым файла. Файл состоит из меток, которые я анализирую. У каждой строки есть метка, и у меня есть proc
определенная для каждой метки, так что eval
выполнение завершается успешно. Однако иногда пользователи добавляют новые метки, а затем eval
команда завершается с ошибкой из-за неизвестной команды.
Есть ли способ предотвратить сбой Tcl при попытке eval
выполнить неизвестную команду?
В идеале, это должно позволять мне заменять своим собственным определенным поведением, таким как извлечение ошибки и продолжение eval
.
Редактировать:
К сожалению, я могу использовать только Tcl 8.4.
Я попытался выполнить следующее, как предложено здесь:
proc handle_unknown_label {cmd args} { ... }
и затем:
rename unknown _old_system_unknown
rename handle_unknown_label unknown
catch {set ret [eval $x]} err
rename unknown handle_unknown_label
rename _old_system_unknown unknown
но я все еще получаю такое же поведение для eval
, и он выводит следующие ошибки:
неизвестная процедура является защищенной процедурой и не будет переименована
неизвестная процедура является защищенной процедурой и не будет переопределена
неизвестная процедура является защищенной процедурой и не будет переименована
неизвестная процедура является защищенной процедурой и не будет переопределена
Комментарии:
1. неприменимо, но если вы читаете файл и оцениваете его, вы можете просто использовать исходный файл вместо этого, нет?
2. в какой среде используется этот интерпретатор Tcl? Я не знаком с этой ошибкой «protected proc».
3. @glenn Интересно. Так это могло быть что-то, что было отключено в моей фирме?
4. Единственное, что пришло на ум, это то, что вы подключены к безопасному интерпретатору, но даже это не мешает вам определять
unknown
процедуру. Ваш интерпретатор Tcl должен быть специально сконструирован так, чтобы быть сверхпараноидальным.
Ответ №1:
Я думаю, что констатирую очевидное, но eval
редактирование файла опасно: любой пользователь может внедрить [exec whatever they wish]
в такой файл.
Гораздо лучше было бы прочитать эти «метки» и использовать гигантский переключатель или хэш-карту или что-то еще для выполнения предопределенной команды. Перехват несуществующих «меток» также не становится проблемой.
Комментарии:
1. Я ценю предложение. Однако на самом деле это не ответ на мой вопрос, и я думаю, что это должен быть комментарий.
2. Это довольно хороший ответ, TBH. Сохраняйте список всех допустимых меток, если той, которую вы только что прочитали, нет в этом списке, вызовите процедуру по вашему выбору. Это точно решает проблему и повышает безопасность загрузки.
Ответ №2:
Реализуйте свою собственную команду с именем unknown
, которая принимает в качестве аргументов все слова, составляющие команду, которую невозможно найти, и ее аргументы:
proc unknown {cmdName args} {
puts "UNKNOWN COMMAND: $cmdName"
puts "CALLED WITH ARGUMENTS: $args"
}
Это практически все, что вам нужно сделать, хотя вы можете стать более изобретательным с использованием namespace unknown
.
Комментарии:
1. Спасибо! Можете ли вы привести пример того, как использовать
namespace unknown
команду? Я хотел бы временно изменить обработку неизвестных команд, поэтому я хотел бы знать, как изменить, а затем восстановить обработку по умолчанию.2. @Amir: Кто-то сильно заблокировал вас, поэтому мы мало что можем предложить (кроме, возможно, чтения документов в системе хостинга). Мы рассказали вам о стандартном механизме языка…