2017-08-29 2 views

Répondre

1

Si vous regardez dans la variable globale errorInfo, vous verrez une trace de pile qui contient les informations que vous voulez. Vous pouvez également obtenir cette information en ajoutant un argument variable supplémentaire à l'appel catch après errMsg, dans lequel sera écrit un dictionnaire incluant la trace d'informations d'erreur ainsi que d'autres éléments (par exemple, le code d'exception lisible par ordinateur).


[EDIT]: Dans Tcl 8.6, le dictionnaire d'options d'exception a un élément -errorstack qui contient une description de ce qui est appelé. Voici une session interactive qui montre ceci:

% 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 

La pile d'erreur comporte des paires d'éléments pour diverses choses, mais les principaux sont ceux de type CALL, où le deuxième élément de chaque paire est la liste des arguments qui ont été utilisé pour faire l'appel. Il pourrait être possible de s'en servir pour obtenir le nom. (Le type INNER fait référence à l'état d'exécution du moteur de code d'octet Tcl, et je ne sais pas s'il existe d'autres types.)

+0

J'ai essayé d'ajouter une variable supplémentaire après 'errMsg'. Il attrape le nom de la procédure sous la clé '--errorinfo', mais fait partie de la chaîne du message d'erreur. Cela signifie que je devrai analyser la chaîne pour obtenir le nom. Je pensais qu'il pourrait y avoir un moyen plus propre de l'obtenir. –

+1

@ Mr.SrJenea _Perhaps_ il y a. L'info errorstack dans 8.6 peut être utile. Ou peut être pas; Je ne suis pas du tout sûr de la meilleure façon de l'analyser pour déterminer où se trouve la liste. –

+0

Mes exigences sont limitées à la version 8.5. Je suppose que je vais juste avoir plusieurs blocs 'catch', ou utiliser' regexp' pour extraire le nom de la procédure. Merci –