#c #tcl
#c #tcl
Вопрос:
У меня есть программа на C, которая вызывает интерпретатор TCL через Tcl_EvalFile() . Я проверяю статус, возвращаемый Tcl_EvalFile, и знаю, когда он выдает что-то отличное от TCL_OK. Однако я не получаю никаких отчетов об отслеживании в своей программе, как если бы я использовал tclsh
.
Я знаю о встраивании функций C в TCL, но в моем случае это не сработает. На самом деле я вызываю TCL из функции C, которую вызывает программа Lua. Приведенный пример кода является упрощенной версией.
Вот вызов Tcl_EvalFile():
if ((status = Tcl_EvalFile(interp, script)) != TCL_OK)
{
/* I would like to handle the error here before Tcl_Exit()*/
Tcl_Exit(status);
return TCL_ERROR;
}
Есть ли функция TCL, которую я могу вызвать, которая выдаст сообщение об обратном отслеживании, аналогичное тому, что tclsh
выдает?
Комментарии:
1. Вы проверили документацию Tcl по
Tcl_GetReturnOptions
рабочему примеру plus?2. Спасибо за указатель. Это то, что мне было нужно. Спасибо!
3. Возможно, вы захотите рассмотреть возможность публикации самостоятельного ответа плюс фрагмент текста на свой вопрос для будущих читателей.
Ответ №1:
Самая важная вещь, которую вы можете сделать для обработки ошибки, — это распечатать сообщение об ошибке! Вторая самая важная вещь — распечатать трассировку стека. Tcl помещает сообщение об ошибке в результат интерпретатора, а трассировку стека в специальную глобальную переменную, errorInfo
.
if ((status = Tcl_EvalFile(interp, script)) != TCL_OK) {
// Get the error message out of the way *right now*
fprintf(stderr, "ERROR when reading file %s: %sn", script,
Tcl_GetStringResult(interp));
// Most convenient access for this is to run a tiny Tcl script.
Tcl_Eval(interp, "puts {STACK TRACE:}; puts $errorInfo; flush stdout;");
Tcl_Exit(status);
return TCL_ERROR; // This should be unreachable; Tcl_Exit doesn't return...
}
Комментарии:
1. Вы также можете получить трассировку ошибок из словаря параметров возврата … но это больше работы.
tclsh
считывает глобальную переменную.