Exception Tcl捕获以显示过程名称

Exception Tcl捕获以显示过程名称,exception,tcl,try-catch,Exception,Tcl,Try Catch,假设我在一个catch块中有多个过程调用 catch { proc1 proc2 proc3 } errMsg 是否有一种方法可以显示捕获异常后哪个过程抛出了异常?如果查看errorInfo全局变量,您将看到一个包含所需信息的堆栈跟踪。您还可以通过在errMsg之后的catch调用中添加一个额外的变量参数来获取该信息,该调用将写入一个字典,其中包括错误信息跟踪以及其他内容(例如,计算机可读的异常代码) [编辑]:在Tcl 8.6中,异常选项字典有一个元素-errors

假设我在一个
catch
块中有多个过程调用

catch {
    proc1
    proc2
    proc3
} errMsg

是否有一种方法可以显示捕获异常后哪个过程抛出了异常?

如果查看
errorInfo
全局变量,您将看到一个包含所需信息的堆栈跟踪。您还可以通过在
errMsg
之后的
catch
调用中添加一个额外的变量参数来获取该信息,该调用将写入一个字典,其中包括错误信息跟踪以及其他内容(例如,计算机可读的异常代码)


[编辑]:在Tcl 8.6中,异常选项字典有一个元素
-errorstack
,其中包含对调用内容的描述。下面是一个交互式会话,演示了以下内容:

% proc foo {x} {error $x} 
% proc bar c {catch {puts a;foo $c} a b;return $b}
% bar d
a
-code 1 -level 0 -errorstack {INNER {returnImm d {}} CALL {foo d} CALL {bar d}} -errorcode NONE -errorinfo {d
    while executing
"error $x"
    (procedure "foo" line 1)
    invoked from within
"foo $c"} -errorline 1

错误堆栈中有用于各种事情的成对元素,但关键元素是
调用
类型元素,其中每对元素的第二个元素是用于实际执行调用的参数列表。也许可以利用这个来获取名称。(内部类型是指Tcl字节码引擎的执行状态,我不知道是否还有其他类型。)

我试图在
errMsg
之后添加一个额外的变量。它确实捕获了
-errorinfo
键下的过程名称,但它是错误消息字符串的一部分。这意味着我需要解析字符串以获得名称。我想可能会有更干净的方法。@SrJenea先生也许有。8.6中的errorstack信息可能会有所帮助。或许不是;我根本不确定解析它以确定在列表中的位置的最佳方法是什么。我的要求仅限于8.5版。我想我要么拥有多个
catch
块,要么使用
regexp
提取过程名称。谢谢