Tcl_Eval在错误时返回调用堆栈

时间:2013-02-04 10:25:58

标签: c++ tcl tcl-api

使用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解释器一样打印掉调用堆栈,以便我知道脚本失败了哪一行?

2 个答案:

答案 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)。