2012-04-04 5 views
9

Come sapere qual è il nome del proc in cui sono. Voglio dire che ho bisogno di questo:TCL ottenere il nome proc in cui sono

proc nameOfTheProc {} { 

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

quindi voglio ottenere "nameOfTheProc" ma non hard-code. In modo che quando qualcuno cambierà il nome proc, funzionerà ancora correttamente.

+0

+1 bella domanda, ha prodotto molte risposte interessanti. –

risposta

11

È possibile utilizzare il comando info level per il vostro problema:

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]'" 
} 

Con l'interno info level si otterrà il livello di profondità chiamata di procedura nella quale sei quello esterno restituirà il nome della procedura. si.

+2

'[info level [info level]]' può essere scritto come '[info level 0]' ... –

+0

@Donal: Sì, hai ragione. – bmk

+2

Se sì, perché non modificare la risposta? – zehelvion

5

Se il tuo Tcl 8.5 o successivo esegue il comando info frame restituirà un dict piuttosto che un elenco. Quindi modificare il codice come segue:

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

Questo non è completamente vero. 'info level' restituirà comunque un elenco (almeno nella versione 8.5). Ma 'info frame' restituisce un dettato. – bmk

+0

@bmk Hai proprio ragione - Ho risolto la risposta in modo che sia il frame delle informazioni nel testo. – Jackson

+0

Il livello di informazioni riguarda gli elenchi di argomenti, il frame di informazioni riguarda i descrittori di frame generali. I due si completano a vicenda. –

5

Il modo idiomatica giusta per ottenere ciò che è implicita nella sua domanda è quello di utilizzare return -code error $message come questo:

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

In questo modo il procedimento si comporterà esattamente in un il modo in cui i comandi Tcl vengono eseguiti quando non sono soddisfatti di ciò con cui sono stati chiamati: causerebbe un errore nel sito di chiamata.

+0

+1 Sono in @kostix in questo. –

+0

Questo non mi dice quale proc è stato chiamato, vero? – Narek

+0

@Narek, lo vedrai dallo stack trace che includerà sia il messaggio di errore che il nome della procedura che ha restituito l'errore. Se rilevi questo errore (cioè non permetti al runtime di terminare il programma e scaricare la traccia dello stack) sarai in grado di ispezionare la situazione usando gli strumenti descritti nel ['return'] (http: //www.tcl. tk/man/tcl8.5/TclCmd/return.htm) manuale ('errorInfo' etc). – kostix

Problemi correlati