TCL获取我所在的过程名称

17

如何知道当前进程的名称?我的意思是我需要这个:

proc nameOfTheProc {} {

    #a lot of code here
    puts "ERROR: You are using 'nameOfTheProc' proc wrongly"
}

我想获取“nameOfTheProc”,但不要硬编码。这样当有人更改存储过程名称时,它仍将正常工作。


+1 很好的问题,它产生了许多有趣的答案。 - glenn jackman
3个回答

17

您可以使用 info level 命令来解决问题:

proc nameOfTheProc {} {

    #a lot of code here
    puts "ERROR: You are using '[lindex [info level 0] 0]' proc wrongly"
    puts "INFO:  You specified the arguments: '[lrange [info level [info level]] 1 end]'"
}

使用内部的info level,你可以获得当前所在过程调用深度的级别。而外部则会返回所在过程本身的名称。


3
[info level [info level]]可以写作[info level 0]... - Donal Fellows

6

实现您问题中所暗示的正确惯用方法是使用return -code error $message,如下所示:

proc nameOfTheProc {} {
    #a lot of code here
    return -code error "Wrong sequence of blorbs passed"
}

这样,当您的过程对其所调用的内容不满意时,它会像普通的Tcl命令一样表现,会在调用站点引发错误。

这并没有告诉我调用了哪个过程,不是吗? - Narek
1
@Narek,您将从堆栈跟踪中看到这一点,其中将包括错误消息和返回错误的过程名称。如果您捕获该错误(即不允许运行时终止程序并转储堆栈跟踪),则可以使用return手册中描述的工具来检查情况(errorInfo等)。 - kostix
1
@Narek,基本上建议学习由专业人士编写的Tcl代码(使用tcllib中的模块是很好的例子)。你会发现他们大量使用return -code error这种惯用语法,因为调用error(或使用其他方式进行错误报告)是为了信号化“外部”运行时错误,例如无法获取资源或完成请求的操作等,而return -code error则用于报告“静态”的语义错误,例如以错误的方式调用命令。 - kostix

5
如果您运行的是Tcl 8.5或更高版本,则info frame命令将返回一个字典而不是列表。因此,请按以下方式修改代码:
proc nameOfTheProc {} {
   puts "This is [dict get [info frame [info frame]] proc]"
}

这并不完全正确。info level 仍然会返回一个列表(至少在8.5版本中)。但是 info frame 返回一个字典。 - bmk
@bmk 你说得很对 - 我已经修正了答案,所以它在文本中是信息框架。 - Jackson
信息级别涉及参数列表,信息框架涉及一般框架描述符。两者相互补充。 - Donal Fellows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接