Я не совсем понимаю вопрос, который вы задаете. Похоже, ваша цель - запустить http-сервер в одном интерпретаторе, но каким-то образом взаимодействовать с основным интерпретатором. Это правильно? Если да, то как это связано с bgerror?
Знаете ли вы, что, хотя сервер запускается в отдельном интерпретаторе, он не работает в отдельном потоке? То есть вы не можете (*) взаимодействовать с основным интерпретатором, в то время как любой интерпретатор заблокирован vwait.
(*) вы можете, если ваше взаимодействие принимает форму Tk-виджетов, которые также используют цикл событий
Что касается того, как использовать bgerror, есть несколько способов, которыми он работает. Механизм по умолчанию вызывает функцию «bgerror», которую вы можете определить, чтобы делать все, что вы хотите. Он принимает одну строку (текст сообщения об ошибке) и что-то с ней делает. Что что-то может быть напечатано ошибка в стандартный вывод, показать ее в диалоговом окне, записать в файл и т. д.
В качестве примера рассмотрим этот интерактивный сеанс:
% proc bgerror {s} {puts "hey! I caught an error: $s"}
% # after 30 seconds, throw an error
% after 30000 {error "this is an error"}
after#0
% # after 40 seconds, terminate the event loop
% after 40000 {set ::done 1}
after#1
% # start the event loop
% vwait ::done
hey! I caught an error: this is an error
% # this prompt appears after 40 seconds or so
Вы также можете зарегистрировать свой собственный обработчик ошибок, как описано в документации к «interp bgerror». Это произошло в tcl 8.5, хотя в нем была ошибка 1017 *, которая не была исправлена до 8.5.3.
Например:
% set foo [interp create]
interp0
% $foo eval {proc myErrorHandler {args} {puts "myErrorHandler: $args"}}
% $foo bgerror myErrorHandler
myErrorHandler
% # after 30 seconds, throw an error
% $foo eval {after 30000 {error "this is an error"}}
after#0
% # after 40 seconds, terminate the loop
% $foo eval {after 40000 {set ::done 1}}
after#1
% $foo eval {vwait ::done}
myErrorHandler: {this is an error} {-code 1 -level 0 -errorcode NONE -errorinfo {this is an error
while executing
"error "this is an error""
("after" script)} -errorline 1}
% # this prompt appears after 40 seconds or so
Помогает ли это ответить на ваш вопрос?