Error managementΒΆ
All errors are reported as function return values
All results are reported as output parameters
All functions
idba_set*
set the input of action routinesAll functions
idba_enq*
get the output of action routines
Errors can be handled by checking the return value of every function:
! Example error handling
ierr = idba_connect(dbhandle, "dburl")
if (ierr.ne.0) then
! handle the error...
end if
Or they can be handled by installing a callback function that is automatically called in case of error:
! How to set a callback
! * the first parameter is the error code that triggers the callback (0
! means 'trigger on all errors')
! * the second parameter is the routine to call when the error happens
! (remember to declare the function as 'external'
! * the third parameter is a convenience arbitrary integer that will be
! passed to the function
! * the fourth parameter is used to return a handle that can be used to
! remove the callback
ierr = idba_error_set_callback(0, error_handler, 42, cb_handle)
The previous code will setup DB-ALLe to call error_handler
after any error,
passing it the integer value 42. The callback can be removed at any time by
calling idba_error_remove_callback()
:
! How to remove a callback
ierr = idba_error_remove_callback(cb_handle)
This is an example of a useful error handling function:
! The error handler needs to be declared 'external'
external error_handler
! Compute the length of a string
! (this is an utility function that is used by the error handler
! to print nicer error messages)
integer function istrlen(string)
character string*(*)
istrlen = len(string)
do while ((string(istrlen:istrlen).eq." " .or. string(istrlen:istrlen).eq."").and. istrlen.gt.0)
istrlen = istrlen - 1
enddo
return
end
! Generic error handler: print all available information
! about the error, then exit
subroutine error_handler(val)
integer val
character buf*1000
print *,ier," testcb in ",val
call idba_error_message(buf)
print *,buf(:istrlen(buf))
call idba_error_context(buf)
print *,buf(:istrlen(buf))
call idba_error_details(buf)
print *,buf(:istrlen(buf))
call exit (1)
return
end
This code introduces three new functions:
idba_error_message()
: returns a string describing what type of error has happened.idba_error_context()
: returns a string describing what DB-All.e was trying to do when the error happened.idba_error_details()
: returns a detailed description of the error, when available. If no detailed description is available, it returns an empty string.
A similar error handling behaviour can be obtained by using the predefined
convenience function idba_default_error_handler()
:
! Declare the external function (not necessary if you include dballeff.h)
external idba_default_error_handler
! Use it as the error handling callback
ierr = idba_error_set_callback(0, idba_default_error_handler, 1, cb_handle)
An alternative error handler called idba_error_handle_tolerating_overflows()
is available: it exists on all errors instead of value overflows, in what case
it prints a warning to standard error and allows the program to continue. The
overflow error can then be catched, if needed, by inspecting the error code
returned by the DB-All.e function that causes the error.
This is how to use it:
! Declare the external function (not necessary if you include dballeff.h)
external idba_error_handler_tolerating_overflows
! Use it as the error handling callback
ierr = idba_error_set_callback(0, idba_error_handler_tolerating_overflows, 1, cb_handle)