Tk::Error - Method invoked to process background errors
my ($widget,$error,@locations) = @_;
method is invoked by perl/Tk when a background error
occurs. Two possible implementations are provided in the distribution and
individual applications or users can (re)define a Tk::Error
(e.g. as a perl sub) if they wish to handle background errors in some other
A background error is one that occurs in a command that didn't originate with
the application. For example, if an error occurs while executing a callback
specified with a bind or a after command, then it is a background error. For a
non-background error, the error can simply be returned up through nested
subroutines until it reaches the top-level code in the application; then the
application can report the error in whatever way it wishes. When a background
error occurs, the unwinding ends in the Tk library and there is no obvious way
for Tk to report the error.
When Tk detects a background error, it saves information about the error and
invokes the Tk::Error
method later when Tk is idle.
is invoked by perl/Tk as if by the perl code:
, location ...
is the MainWindow
associated with widget
which detected the error, "error message"
is a string
describing the error that has been detected, location
is a list of one
or more "locations" which describe the call sequence at the point
the error was detected.
The locations are a typically a mixture of perl location reports giving script
name and line number, and simple strings describing locations in core Tk or
perl/Tk C code.
Tk will ignore any result returned by the Tk::Error
method. If another
error occurs within the Tk::Error
method (for example if it calls
) then Tk reports this error itself by writing a message to stderr
(this is to avoid infinite loops due to any bugs in Tk::Error
If several background errors accumulate before Tk::Error
is invoked to
process them, Tk::Error
will be invoked once for each error, in the
order they occurred. However, if Tk::Error
then any remaining errors are skipped without calling Tk::Error
module includes a default Tk::Error
subroutine that simply
reports the error on stderr.
An alternate definition is provided via:
that posts a dialog box containing the error message and offers the user a
chance to see a stack trace showing where the error occurred.
This is an OO implementation of the Tcl/Tk command bgerror
, with a twist:
since there is only one ErrorDialog
widget, you aren't required to
invoke the constructor to create it; it will be created automatically when the
first background error occurs. However, in order to configure the
and -appendtraceback ErrorDialog
must call the constructor and create it manually.
object essentially consists of two subwidgets: a
widget to display the background error and a Text
for the traceback information. If required, you can invoke various widget
methods to customize these subwidgets - their advertised names are described
, -appendtraceback => bool
$mw is a window reference.
is a CODE reference if special post-background error processing is
required (default is undefined). The callback subroutine is called with @_
having the same arguments that Tk::Error
was invoked with.
is a boolean indicating whether or not to append successive
tracebacks (default is 1, do append).
is the Dialog widget reference.
is the Text widget reference containing the traceback information.
are not invoked as methods of a widget then
perl/Tk is unable to provide a $mainwindow
support such code from earlier versions of perl/Tk perl/Tk therefore calls
with string 'Tk' instead: Tk->Tk::Error\(...\)
this case the Tk::Error
implementations cannot "popup" a window as they don't know which
display to use. A mechanism to supply the MainWindow
applications which only have one (a very common case) should be provided.
Tk::bind Tk::after Tk::fileevent
background error, reporting