使用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 :(得分:1)
我使用以下代码撤回并报告解释器提供的errorinfo。
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 :(得分:1)
您要查找的信息,错误信息(即堆栈跟踪)位于全局errorInfo
变量中。可以使用Tcl_GetVar
或其相关功能之一来检索此信息。最好选择的是Tcl_GetVar2Ex
(名称是缓慢发展的API的产品),效率很高:
Tcl_Obj *infoObj = Tcl_GetVar2Ex(interp, "errorInfo", NULL, TCL_GLOBAL_ONLY);
然后您使用Tcl_GetString
将人类可读的部分提取为char *
(视为const
)。