2017-08-29 3 views

Antwort

1

Wenn Sie in der globalen Variablen errorInfo suchen, sehen Sie eine Stapelüberwachung, die die gewünschten Informationen enthält. Sie können diese Information auch erhalten, indem Sie dem catch-Aufruf nach errMsg ein zusätzliches variables Argument hinzufügen, das ein Wörterbuch geschrieben haben wird, das die Fehlerinfo-Ablaufverfolgung sowie andere Dinge (z. B. den computerlesbaren Ausnahmecode) enthält.


[EDIT]: In Tcl 8.6, die Ausnahme Option Wörterbuch ein Element -errorstack, die eine Beschreibung des enthält, was genannt wird. Hier ist eine interaktive Sitzung, die dies zeigt:

% 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 

Der Fehler-Stack hat Paare von Elementen für verschiedene Dinge, aber die wichtigsten diejenigen sind die CALL Typ diejenigen, in denen das zweite Element jedes Paares ist die Liste der Argumente, die waren verwendet, um den Anruf tatsächlich zu tun. Es könnte möglich sein, davon Gebrauch zu machen, um den Namen zu erhalten. (Der Typ INNER bezieht sich auf den Ausführungszustand der Tcl-Bytecode-Engine, und ich weiß nicht, ob es andere Typen gibt.)

+0

Ich habe versucht, eine zusätzliche Variable nach 'errMsg' hinzuzufügen. Es fängt den Namen der Prozedur unter dem Schlüssel "-rorinfo" ab, aber es ist Teil der Fehlermeldung. Das bedeutet, dass ich die Zeichenfolge analysieren muss, um den Namen zu erhalten. Ich dachte, es könnte einen saubereren Weg geben, es zu bekommen. –

+1

@ Mr.SrJenea _Perhaps_ gibt es. Die Fehlerstack-Informationen in 8.6 können hilfreich sein. Oder vielleicht nicht; Ich bin mir überhaupt nicht sicher, was der beste Weg ist, um zu analysieren, wo in der Liste zu suchen ist. –

+0

Meine Anforderungen sind auf Version 8.5 beschränkt. Ich denke, ich werde entweder mehrere 'catch' Blöcke haben oder' regexp' verwenden, um den Prozedurnamen zu extrahieren. Vielen Dank –

Verwandte Themen