2012-04-04 57 views
9

如何知道我所处的过程名称是什么。我的意思是我需要这个:TCL获取我所在的过程名称

proc nameOfTheProc {} { 

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

所以我想获得“nameOfTheProc”,但不是硬编码。所以当有人改变proc的名字时,它仍然可以正常工作。

+0

+1个不错的问题,它产生了很多有趣的答案。 – 2012-04-04 16:40:16

回答

11

可以使用info level命令您的问题:

proc nameOfTheProc {} { 

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

与内info level你会得到的程序调用深度的水平,你目前在外层一个将返回过程的名称。本身。

+2

'[info level [info level]]'可以写成'[info level 0]'... – 2012-04-04 14:41:56

+0

@Donal:是的 - 你是对的。 – bmk 2012-04-04 14:48:23

+2

如果是这样,为什么不编辑答案? – zehelvion 2014-02-12 18:54:39

5

如果您运行的Tcl 8.5或更高版本的info frame命令将返回一个字典而不是列表。因此,修改代码如下:

proc nameOfTheProc {} { 
    puts "This is [dict get [info frame [info frame]] proc]" 
} 
+0

这不完全正确。 'info level'仍然会返回一个列表(至少在8.5版本中)。但是'info frame'返回一个字典。 – bmk 2012-04-04 14:46:50

+0

@bmk你很对 - 我已经修复了答案,所以它是文本中的信息框架。 – Jackson 2012-04-04 14:51:58

+0

信息级别是关于参数列表,信息帧是关于一般帧描述符。两者相辅相成。 – 2012-04-04 16:49:47

5

正确的惯用方法来达到什么你的问题暗示是使用return -code error $message这样的:

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

这样你的程序的行为完全在当他们不满意他们被调用的内容时,Tcl命令会执行这些命令:它会在调用站点上导致错误。

+0

+1我在这里用@kostix。 – 2012-04-04 15:36:57

+0

这不告诉我叫什么过程,是吗? – Narek 2012-04-05 08:30:35

+0

@Narek,你会从堆栈跟踪中看到这一点,它将包含错误消息和返回错误的过程名称。如果你会捕获这个错误(即不允许运行时终止程序并转储堆栈跟踪),你将能够使用['return'](http://www.tcl。 tk/man/tcl8.5/TclCmd/return.htm)手册('errorInfo'等)。 – kostix 2012-04-05 11:22:56