Предотвратить сбой Tcl при неизвестной команде

#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: Кто-то сильно заблокировал вас, поэтому мы мало что можем предложить (кроме, возможно, чтения документов в системе хостинга). Мы рассказали вам о стандартном механизме языка…