Tcl_Eval для возврата стеков вызовов при ошибке

При использовании 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, чтобы я знал, на какой строке происходит сбой скрипта?

0

Решение

Информация, которую вы ищете, информация об ошибке (т.е. трассировка стека), находится в глобальном errorInfo переменная. Эта информация может быть получена с Tcl_GetVar или одна из связанных с ней функций. Один из лучших на выбор Tcl_GetVar2Ex (название является продуктом медленно развивающегося API), который очень эффективен:

Tcl_Obj *infoObj = Tcl_GetVar2Ex(interp, "errorInfo", NULL, TCL_GLOBAL_ONLY);

Тогда вы используете Tcl_GetString извлечь читабельную часть как char * (рассматривать в качестве const).

1

Другие решения

Я использую следующий код, чтобы получить информацию об ошибке и сообщить об этом в интерпретаторе.

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 — мой макрос сообщений об ошибках, который нужно заменить своим собственным.

1

По вопросам рекламы [email protected]