2013-02-04 67 views
0

,如果它返回TCL_ERROR,錯誤消息可以從Tcl_GetStringResult(interp)檢索。但是,在執行一堆tcl腳本時,錯誤消息並不表示腳本失敗。Tcl_Eval返回調用棧當使用Tcl的C++ API <strong>Tcl_Eval</strong>當錯誤

如:

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

可以'Tcl_GetErrorLine'是你在找什麼? –

+1

@Tony:這隻會從上面的消息中返回'5'(好吧,也許;這是非常依賴於上下文的)。 –

回答

1

您正在查找的信息,錯誤信息(即堆棧跟蹤)位於全局變量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是我的錯誤報告宏,您需要用您自己的錯誤報告宏替換它。

相關問題