Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tcl:Is there a way to show which line in tcl throw an error?

Tags:

tcl

When I source a tcl file, error will be report when run to a unknown command.

Tcl> source run.tcl
$inside tcl file$$> setup_desgin
    Design setup...
    Done
$inside tcl file$$> my_prove
    Info: proving started
    Info: ....
    Info: ....
$inside tcl file$$> ::unknown my_pro
    invalid command name "my_pro"

Is there a way to show the line number of the error line in tcl file as below?

Tcl> source run.tcl
$inside tcl file$$> setup_desgin
    Design setup...
    Done
$inside tcl file$$> my_prove
    Info: proving started
    Info: ....
    Info: ....
$inside tcl file$$> ::unknown my_pro
    invalid command name "my_pro" (run.tcl:5)

We want this because we may have a very big run.tcl with minions of line.

like image 315
Leo Avatar asked Sep 14 '25 10:09

Leo


1 Answers

It's actually quite difficult to get this information in general. The accurate line number information is only available at present when the code is on the execution stack. Fortunately, you can find out what's going on with a leave-step trace (intercepting unknown would only work for unknown commands; tracing lets all errors be caught). In the code below, I've put it on eval, but in a more practical example you'd put it on source or something like that.

set errorlineSet 0
proc LEAVESTEP {cmd code result op args} {
    global errorline errorlineSet
    if {$code == 1} {
        if {!$errorlineSet} {
            set errorline [dict get [info frame -4] line]
        }
        set errorlineSet 1
    } else {
        set errorlineSet 0
    }
}

try {
    trace add execution eval leavestep LEAVESTEP
    eval {
        sdfgsldfjg;   # This is line 17
    }
} on error {msg opt} {
    puts "ERROR: $msg (line: $errorline) (local line: [dict get $opt -errorline])"
} finally {
    trace remove execution eval leavestep LEAVESTEP
}

When I save all that to a file and run it, it prints this:

ERROR: invalid command name "sdfgsldfjg" (line: 17) (local line: 3)

As you can see, there is also the -errorline key in the result option dictionary, but that's mapped to 3 in this case and that's rather misleading! It uses that value because of backward compatibility, but I'm not convinced that it is all that helpful.

like image 134
Donal Fellows Avatar answered Sep 17 '25 19:09

Donal Fellows