📄 err.texi
字号:
@cindex error handlingThis chapter describes the way that GSL functions report and handleerrors. By examining the status information returned by every functionyou can determine whether it succeeded or failed, and if it failed youcan find out what the precise cause of failure was. You can also defineyour own error handling functions to modify the default behavior of thelibrary.The functions described in this section are declared in the header file@file{gsl_errno.h}.@menu* Error Reporting:: * Error Codes:: * Error Handlers:: * Using GSL error reporting in your own functions:: * Error Reporting Examples:: @end menu@node Error Reporting@section Error ReportingThe library follows the thread-safe error reporting conventions of the@sc{posix} Threads library. Functions return a non-zero error code toindicate an error and @code{0} to indicate success.@exampleint status = gsl_function (...)if (status) @{ /* an error occurred */ ..... /* status value specifies the type of error */@}@end exampleThe routines report an error whenever they cannot perform the taskrequested of them. For example, a root-finding function would return anon-zero error code if could not converge to the requested accuracy, orexceeded a limit on the number of iterations. Situations like this area normal occurrence when using any mathematical library and you shouldcheck the return status of the functions that you call.Whenever a routine reports an error the return value specifies the typeof error. The return value is analogous to the value of the variable@code{errno} in the C library. The caller can examine the return codeand decide what action to take, including ignoring the error if it isnot considered serious.In addition to reporting errors by return codes the library also has anerror handler function @code{gsl_error}. This function is called byother library functions when they report an error, just before theyreturn to the caller. The default behavior of the error handler is toprint a message and abort the program,@examplegsl: file.c:67: ERROR: invalid argument supplied by userDefault GSL error handler invoked.Aborted@end exampleThe purpose of the @code{gsl_error} handler is to provide a functionwhere a breakpoint can be set that will catch library errors whenrunning under the debugger. It is not intended for use in productionprograms, which should handle any errors using the return codes.@node Error Codes@section Error CodesThe error code numbers returned by library functions are defined in thefile @file{gsl_errno.h}. They all have the prefix @code{GSL_} andexpand to non-zero constant integer values. Many of the error codes usethe same base name as a corresponding error code in C library. Here aresome of the most common error codes,@cindex error codes@deftypefn {Macro} int GSL_EDOMDomain error; used by mathematical functions when an argument value doesnot fall into the domain over which the function is defined (likeEDOM in the C library)@end deftypefn@deftypefn {Macro} int GSL_ERANGERange error; used by mathematical functions when the result value is notrepresentable because of overflow or underflow (like ERANGE in the Clibrary)@end deftypefn@deftypefn {Macro} int GSL_ENOMEMNo memory available. The system cannot allocate more virtual memorybecause its capacity is full (like ENOMEM in the C library). This erroris reported when a GSL routine encounters problems when trying toallocate memory with @code{malloc}.@end deftypefn@deftypefn {Macro} int GSL_EINVALInvalid argument. This is used to indicate various kinds of problemswith passing the wrong argument to a library function (like EINVAL in the Clibrary). @end deftypefnThe error codes can be converted into an error message using thefunction @code{gsl_strerror}.@deftypefun {const char *} gsl_strerror (const int @var{gsl_errno})This function returns a pointer to a string describing the error code@var{gsl_errno}. For example,@exampleprintf ("error: %s\n", gsl_strerror (status));@end example@noindentwould print an error message like @code{error: output range error} for astatus value of @code{GSL_ERANGE}.@end deftypefun@node Error Handlers@section Error Handlers@cindex Error handlersThe default behavior of the GSL error handler is to print a shortmessage and call @code{abort()}. When this default is in use programswill stop with a core-dump whenever a library routine reports an error.This is intended as a fail-safe default for programs which do not checkthe return status of library routines (we don't encourage you to writeprograms this way).If you turn off the default error handler it is your responsibility tocheck the return values of routines and handle them yourself. You canalso customize the error behavior by providing a new error handler. Forexample, an alternative error handler could log all errors to a file,ignore certain error conditions (such as underflows), or start thedebugger and attach it to the current process when an error occurs.All GSL error handlers have the type @code{gsl_error_handler_t}, which isdefined in @file{gsl_errno.h},@deftp {Data Type} gsl_error_handler_tThis is the type of GSL error handler functions. An error handler willbe passed four arguments which specify the reason for the error (astring), the name of the source file in which it occurred (also astring), the line number in that file (an integer) and the error number(an integer). The source file and line number are set at compile timeusing the @code{__FILE__} and @code{__LINE__} directives in thepreprocessor. An error handler function returns type @code{void}.Error handler functions should be defined like this,@examplevoid handler (const char * reason, const char * file, int line, int gsl_errno)@end example@end deftp@comment @noindentTo request the use of your own error handler you need to call thefunction @code{gsl_set_error_handler} which is also declared in@file{gsl_errno.h},@deftypefun {gsl_error_handler_t *} gsl_set_error_handler (gsl_error_handler_t @var{new_handler})This function sets a new error handler, @var{new_handler}, for the GSLlibrary routines. The previous handler is returned (so that you canrestore it later). Note that the pointer to a user defined errorhandler function is stored in a static variable, so there can be onlyone error handler per program. This function should be not be used inmulti-threaded programs except to set up a program-wide error handlerfrom a master thread. The following example shows how to set andrestore a new error handler,@example/* save original handler, install new handler */old_handler = gsl_set_error_handler (&my_handler); /* code uses new handler */..... /* restore original handler */gsl_set_error_handler (old_handler); @end example@noindentTo use the default behavior (@code{abort} on error) set the errorhandler to @code{NULL},@exampleold_handler = gsl_set_error_handler (NULL); @end example@end deftypefun@deftypefun {gsl_error_handler_t *} gsl_set_error_handler_off ()This function turns off the error handler by defining an error handlerwhich does nothing. This will cause the program to continue after anyerror, so the return values from any library routines must be checked.This is the recommended behavior for production programs. The previoushandler is returned (so that you can restore it later).@end deftypefunThe error behavior can be changed for specific applications byrecompiling the library with a customized definition of the@code{GSL_ERROR} macro in the file @file{gsl_errno.h}.@node Using GSL error reporting in your own functions@section Using GSL error reporting in your own functions@cindex error handling macrosIf you are writing numerical functions in a program which also uses GSLcode you may find it convenient to adopt the same error reportingconventions as in the library.To report an error you need to call the function @code{gsl_error} with astring describing the error and then return an appropriate error codefrom @code{gsl_errno.h}, or a special value, such as @code{NaN}. Forconvenience the file @file{gsl_errno.h} defines two macros which carryout these steps:@deffn {Macro} GSL_ERROR (@var{reason}, @var{gsl_errno})This macro reports an error using the GSL conventions and returns astatus value of @code{gsl_errno}. It expands to the following code fragment,@examplegsl_error (reason, __FILE__, __LINE__, gsl_errno);return gsl_errno;@end example@noindentThe macro definition in @file{gsl_errno.h} actually wraps the codein a @code{do @{ ... @} while (0)} block to prevent possibleparsing problems.@end deffnHere is an example of how the macro could be used to report that aroutine did not achieve a requested tolerance. To report the error theroutine needs to return the error code @code{GSL_ETOL}.@exampleif (residual > tolerance) @{ GSL_ERROR("residual exceeds tolerance", GSL_ETOL); @}@end example@deffn {Macro} GSL_ERROR_VAL (@var{reason}, @var{gsl_errno}, @var{value})This macro is the same as @code{GSL_ERROR} but returns a user-definedvalue of @var{value} instead of an error code. It can be used formathematical functions that return a floating point value.@end deffnThe following example shows how to return a @code{NaN} at a mathematicalsingularity using the @code{GSL_ERROR_VAL} macro,@exampleif (x == 0) @{ GSL_ERROR_VAL("argument lies on singularity", GSL_ERANGE, GSL_NAN); @}@end example@node Error Reporting Examples@section ExamplesHere is an example of some code which checks the return value of afunction where an error might be reported,@example#include <stdio.h>#include <gsl/gsl_errno.h>#include <gsl/gsl_fft_complex.h>... int status; size_t n = 37; gsl_set_error_handler_off(); status = gsl_fft_complex_radix2_forward (data, n); if (status) @{ if (status == GSL_EINVAL) @{ fprintf (stderr, "invalid argument, n=%d\n", n); @} else @{ fprintf (stderr, "failed, gsl_errno=%d\n", status); @} exit (-1); @}...@end example@comment @noindentThe function @code{gsl_fft_complex_radix2} only accepts integer lengthswhich are a power of two. If the variable @code{n} is not a power oftwo then the call to the library function will return @code{GSL_EINVAL},indicating that the length argument is invalid. The function call to@code{gsl_set_error_handler_off()} stops the default error handler fromaborting the program. The @code{else} clause catches any other possibleerrors.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -