При использовании Tcl C ++ API Tcl_Eval, если он вернется TCL_ERROR, сообщение об ошибке можно получить из Tcl_GetStringResult(interp)
, Однако при выполнении набора сценариев tcl в сообщении об ошибке не указывается, в какой строке происходит сбой сценария.
Например:
can't find package foobar
while executing
"package require foobar"(file "./test.tn" line 5)
Tcl_GetStringResult(interp)
не предоставляет эту информацию: (file "./test.tn" line 5)
, Есть ли способ распечатать стек вызовов, как в интерпретаторе tcl, чтобы я знал, на какой строке происходит сбой скрипта?
Информация, которую вы ищете, информация об ошибке (т.е. трассировка стека), находится в глобальном errorInfo
переменная. Эта информация может быть получена с Tcl_GetVar
или одна из связанных с ней функций. Один из лучших на выбор Tcl_GetVar2Ex
(название является продуктом медленно развивающегося API), который очень эффективен:
Tcl_Obj *infoObj = Tcl_GetVar2Ex(interp, "errorInfo", NULL, TCL_GLOBAL_ONLY);
Тогда вы используете Tcl_GetString
извлечь читабельную часть как char *
(рассматривать в качестве const
).
Я использую следующий код, чтобы получить информацию об ошибке и сообщить об этом в интерпретаторе.
Tcl_Obj *top_interpInfoName ;
Tcl_Obj *top_interpInfo ;
top_interpInfoName = Tcl_NewStringObj("errorInfo", -1) ;
Tcl_IncrRefCount(top_interpInfoName) ;
top_interpInfo = Tcl_ObjGetVar2(tcl_interp,
top_interpInfoName,
NULL,
TCL_LEAVE_ERR_MSG) ;
Tcl_IncrRefCount(top_interpInfo) ;
ERR_REP2("ERROR: %s", Tcl_GetString(top_interpInfo)) ;
Tcl_DecrRefCount(top_interpInfoName) ;
Tcl_DecrRefCount(top_interpInfo) ;
ERR_REP2 — мой макрос сообщений об ошибках, который нужно заменить своим собственным.