В большинстве случаев все, что вам нужно сделать, чтобы перехватить такие завершения, - это перехватить команду exit
.
rename exit real_exit
proc exit args {
puts "EXITING"; flush stdout; # Flush because I'm paranoid...
tailcall real_exit {*}$args
}
Это, очевидно, сработает, если вы вызовете ее явно, но он также вызывается, если вы просто отбрасываете конец сценария, сигнализируете о конце файла в интерактивном сеансе или если ваш сценарий содержит ошибку позже и завершается сообщением об ошибке. Это связано с тем, что вызов API Tcl C, Tcl_Exit()
, работает путем вызова exit
и, если это не завершает процесс, непосредственно выполняет сам выход.
Будьте осторожны со сценариями выхода BTW ; ошибки в них сложнее отладить, чем обычно.
Случаи, когда это не работает? В основном там, где сам интерпретатор не может выполнять команды (возможно, из-за того, что он был удален из-под себя) или когда какой-то сигнал закрывает интерпретатор (например, SIGINT не обрабатывается по умолчанию по разным причинам).