Tcl_AddErrorInfo
Section: Tcl Library Procedures (3)
Updated: 8.5
Index
Return to Main Contents
NAME
Tcl_GetReturnOptions, Tcl_SetReturnOptions, Tcl_AddErrorInfo, Tcl_AppendObjToErrorInfo, Tcl_AddObjErrorInfo, Tcl_SetObjErrorCode, Tcl_SetErrorCode, Tcl_SetErrorCodeVA, Tcl_SetErrorLine, Tcl_GetErrorLine, Tcl_PosixError, Tcl_LogCommandInfo - retrieve or record information about errors and other return options
SYNOPSIS
#include <tcl.h>
Tcl_Obj *
Tcl_GetReturnOptions(interp, code)
int
Tcl_SetReturnOptions(interp, options)
Tcl_AddErrorInfo(interp, message)
Tcl_AppendObjToErrorInfo(interp, objPtr)
Tcl_AddObjErrorInfo(interp, message, length)
Tcl_SetObjErrorCode(interp, errorObjPtr)
Tcl_SetErrorCode(interp, element, element, ... (char *)NULL)
Tcl_SetErrorCodeVA(interp, argList)
Tcl_GetErrorLine(interp)
Tcl_SetErrorLine(interp, lineNum)
const char *
Tcl_PosixError(interp)
void
Tcl_LogCommandInfo(interp, script, command, commandLength)
ARGUMENTS
-
-
Tcl_Interp *interp (in)
Interpreter in which to record information.
-
-
int code
The code returned from script evaluation.
-
-
Tcl_Obj *options
A dictionary of return options.
-
-
const char *message (in)
For Tcl_AddErrorInfo,
this is a conventional C string to append to the -errorinfo return option.
For Tcl_AddObjErrorInfo,
this points to the first byte of an array of length bytes
containing a string to append to the -errorinfo return option.
This byte array may contain embedded null bytes
unless length is negative.
-
-
Tcl_Obj *objPtr (in)
A message to be appended to the -errorinfo return option
in the form of a Tcl_Obj value.
-
-
int length (in)
The number of bytes to copy from message when
appending to the -errorinfo return option.
If negative, all bytes up to the first null byte are used.
-
-
Tcl_Obj *errorObjPtr (in)
The -errorcode return option will be set to this value.
-
-
const char *element (in)
String to record as one element of the -errorcode return option.
Last element argument must be (char *)NULL.
-
-
va_list argList (in)
An argument list which must have been initialized using
va_start, and cleared using va_end.
-
-
int lineNum
The line number of a script where an error occurred.
-
-
const char *script (in)
Pointer to first character in script containing command (must be <= command)
-
-
const char *command (in)
Pointer to first character in command that generated the error
-
-
int commandLength (in)
Number of bytes in command;-1 means use all bytes up to first null byte
DESCRIPTION
The Tcl_SetReturnOptions and Tcl_GetReturnOptions
routines expose the same capabilities as the return and
catch commands, respectively, in the form of a C interface.
Tcl_GetReturnOptions retrieves the dictionary of return options
from an interpreter following a script evaluation.
Routines such as Tcl_Eval are called to evaluate a
script in an interpreter. These routines return an integer
completion code. These routines also leave in the interpreter
both a result and a dictionary of return options generated
by script evaluation. Just as Tcl_GetObjResult retrieves
the result, Tcl_GetReturnOptions retrieves the dictionary
of return options. The integer completion code should be
passed as the code argument to Tcl_GetReturnOptions
so that all required options will be present in the dictionary.
Specifically, a code value of TCL_ERROR will
ensure that entries for the keys -errorinfo,
-errorcode, and -errorline will appear in the
dictionary. Also, the entries for the keys -code
and -level will be adjusted if necessary to agree
with the value of code. The (Tcl_Obj *) returned
by Tcl_GetReturnOptions points to an unshared
Tcl_Obj with reference count of zero. The dictionary
may be written to, either adding, removing, or overwriting
any entries in it, without the need to check for a shared value.
As with any Tcl_Obj with reference count of zero, it is up to
the caller to arrange for its disposal with Tcl_DecrRefCount or
to a reference to it via Tcl_IncrRefCount (or one of the many
functions that call that, notably including Tcl_SetObjResult and
Tcl_SetVar2Ex).
A typical usage for Tcl_GetReturnOptions is to
retrieve the stack trace when script evaluation returns
TCL_ERROR, like so:
-
int code = Tcl_Eval(interp, script);
if (code == TCL_ERROR) {
Tcl_Obj *options = Tcl_GetReturnOptions(interp, code);
Tcl_Obj *key = Tcl_NewStringObj("-errorinfo",-1);
Tcl_Obj *stackTrace;
Tcl_IncrRefCount(key);
Tcl_DictObjGet(NULL, options, key, &stackTrace);
Tcl_DecrRefCount(key);
/* Do something with stackTrace */
Tcl_DecrRefCount(options);
}
Tcl_SetReturnOptions sets the return options
of interp to be options. If options
contains any invalid value for any key, TCL_ERROR will
be returned, and the interp result will be set to an
appropriate error message. Otherwise, a completion code
in agreement with the -code and -level
keys in options will be returned.
As an example, Tcl's return command itself could
be implemented in terms of Tcl_SetReturnOptions
like so:
-
if ((objc % 2) == 0) { /* explicit result argument */
obj-;
Tcl_SetObjResult(interp, objv[objc]);
}
return Tcl_SetReturnOptions(interp, Tcl_NewListObj(obj-1, objv+1));
(It is not really implemented that way. Internal access
privileges allow for a more efficient alternative that meshes
better with the bytecode compiler.)
Note that a newly created Tcl_Obj may be passed
in as the options argument without the need to tend
to any reference counting. This is analogous to
Tcl_SetObjResult.
While Tcl_SetReturnOptions provides a general interface
to set any collection of return options, there are a handful
of return options that are very frequently used. Most
notably the -errorinfo and -errorcode return
options should be set properly when the command procedure
of a command returns TCL_ERROR. The -errorline
return option is also read by commands that evaluate scripts
and wish to supply detailed error location information in
the stack trace text they append to the -errorinfo option.
Tcl provides several simpler interfaces to more directly set
these return options.
The -errorinfo option holds a stack trace of the
operations that were in progress when an error occurred,
and is intended to be huma-readable.
The -errorcode option holds a Tcl list of items that
are intended to be machin-readable.
The first item in the -errorcode value identifies the class of
error that occurred
(e.g., POSIX means an error occurred in a POSIX system call)
and additional elements hold additional pieces
of information that depend on the class.
See the manual entry on the errorCode variable for details on the
various formats for the -errorcode option used by Tcl's buil-in
commands.
The -errorinfo option value is gradually built up as an
error unwinds through the nested operations.
Each time an error code is returned to Tcl_Eval, or
any of the routines that performs script evaluation,
the procedure Tcl_AddErrorInfo is called to add
additional text to the -errorinfo value describing the
command that was being executed when the error occurred.
By the time the error has been passed all the way back
to the application, it will contain a complete trace
of the activity in progress when the error occurred.
It is sometimes useful to add additional information to
the -errorinfo value beyond what can be supplied automatically
by the script evaluation routines.
Tcl_AddErrorInfo may be used for this purpose:
its message argument is an additional
string to be appended to the -errorinfo option.
For example, when an error arises during the source command,
the procedure Tcl_AddErrorInfo is called to
record the name of the file being processed and the
line number on which the error occurred.
Likewise, when an error arises during evaluation of a
Tcl procedures, the procedure name and line number
within the procedure are recorded, and so on.
The best time to call Tcl_AddErrorInfo is just after
a script evaluation routine has returned TCL_ERROR.
The value of the -errorline return option (retrieved
via a call to Tcl_GetReturnOptions) often makes up
a useful part of the message passed to Tcl_AddErrorInfo.
Tcl_AppendObjToErrorInfo is an alternative interface to the
same functionality as Tcl_AddErrorInfo. Tcl_AppendObjToErrorInfo
is called when the string value to be appended to the -errorinfo option
is available as a Tcl_Obj instead of as a char array.
Tcl_AddObjErrorInfo is nearly identical
to Tcl_AddErrorInfo, except that it has an additional length
argument. This allows the message string to contain
embedded null bytes. This is essentially never a good idea.
If the message needs to contain the null character U+0000,
Tcl's usual internal encoding rules should be used to avoid
the need for a null byte. If the Tcl_AddObjErrorInfo
interface is used at all, it should be with a negative length value.
The procedure Tcl_SetObjErrorCode is used to set the
-errorcode return option to the list value errorObjPtr
built up by the caller.
Tcl_SetObjErrorCode is typically invoked just
before returning an error. If an error is
returned without calling Tcl_SetObjErrorCode or
Tcl_SetErrorCode the Tcl interpreter automatically sets
the -errorcode return option to NONE.
The procedure Tcl_SetErrorCode is also used to set the
-errorcode return option. However, it takes one or more strings to
record instead of a value. Otherwise, it is similar to
Tcl_SetObjErrorCode in behavior.
Tcl_SetErrorCodeVA is the same as Tcl_SetErrorCode except that
instead of taking a variable number of arguments it takes an argument list.
The procedure Tcl_GetErrorLine is used to read the integer value
of the -errorline return option without the overhead of a full
call to Tcl_GetReturnOptions. Likewise, Tcl_SetErrorLine
sets the -errorline return option value.
Tcl_PosixError
sets the -errorcode variable after an error in a POSIX kernel call.
It reads the value of the errno C variable and calls
Tcl_SetErrorCode to set the -errorcode return
option in the POSIX format.
The caller must previously have called Tcl_SetErrno to set
errno; this is necessary on some platforms (e.g. Windows) where Tcl
is linked into an application as a shared library, or when the error
occurs in a dynamically loaded extension. See the manual entry for
Tcl_SetErrno for more information.
Tcl_PosixError returns a huma-readable diagnostic message
for the error
(this is the same value that will appear as the third element
in the -errorcode value).
It may be convenient to include this string as part of the
error message returned to the application in
the interpreter's result.
Tcl_LogCommandInfo is invoked after an error occurs in an
interpreter. It adds information about the command that was being
executed when the error occurred to the -errorinfo value, and
the line number stored internally in the interpreter is set.
In older releases of Tcl, there was no Tcl_GetReturnOptions
routine. In its place, the global Tcl variables errorInfo
and errorCode were the only place to retrieve the error
information. Much existing code written for older Tcl releases
still access this information via those global variables.
It is important to realize that while reading from those
global variables remains a supported way to access these
return option values, it is important not to assume that
writing to those global variables will properly set the
corresponding return options. It has long been emphasized
in this manual page that it is important to
call the procedures described here rather than
setting errorInfo or errorCode directly with
Tcl_ObjSetVar2.
If the procedure Tcl_ResetResult is called,
it clears all of the state of the interpreter associated with
script evaluation, including the entire return options dictionary.
In particular, the -errorinfo and -errorcode options
are reset.
If an error had occurred, the Tcl_ResetResult call will
clear the error state to make it appear as if no error had
occurred after all.
The global variables errorInfo and
errorCode are not modified by Tcl_ResetResult
so they continue to hold a record of information about the
most recent error seen in an interpreter.
SEE ALSO
Tcl_DecrRefCount(3),
Tcl_IncrRefCount(3),
Tcl_Interp(3),
Tcl_ResetResult(3),
Tcl_SetErrno(3),
errorCode(n),
errorInfo(n)
KEYWORDS
error, value, value result, stack, trace, variable
Index
- NAME
-
- SYNOPSIS
-
- ARGUMENTS
-
- DESCRIPTION
-
- SEE ALSO
-
- KEYWORDS
-