[Mapserver-dev] Error stack system

Daniel Morissette morissette at dmsolutions.ca
Wed Apr 23 11:20:36 EDT 2003

Hi everyone,

Back in January we had a discussion about adding an error stack in 
MapServer to help reporting multiple errors, mostly with things 
like rendering a map composed of multiple WMS layers.

I have finally implemented this.  No worries, there are no changes for
those who don't care about the error stack.  Simply calling msGetErrorObj() 
as usual will continue to work.  Errors are automagically added to the
stack when msSetError() is called, so there is no change required in 
the code that logs errors either.

For those who need access to the stack of error, here is what you 
need to know.  First it's not really a stack, I implemented it as a
chained list in which the first item is the most recent, so it appears
as a stack.  As mentioned above, msGetErrorObj() still returns you the
most recent errorObj, which also happens to be the head of the chained
list, so to access the rest of the list, use ms_error->next until you
hit a next == NULL.

Finally, the caller (MapScript, or the mapserv CGI) is responsible of
clearing the list of errors using msResetErrorList() if/when they 
think it is necessary.

This should all be available in MapScript automagically via the SWIG
wrappers I believe, and I also added wrappers in PHP MapScript.  The
PHP documentation is included below.


 Daniel Morissette               morissette at dmsolutions.ca
 DM Solutions Group              http://www.dmsolutions.ca/


   Instances of errorObj are created internally by MapServer as errors
   happen.  Errors are managed as a chained list with the first item being
   the most recent error.  The head of the list can be fetched using 
   ms_GetErrorObj(), and the list can be cleared using ms_ResetErrorList()


   errorObj ms_GetErrorObj()
        Returns a reference to the head of the list of errorObj.

   void ms_ResetErrorList()
        Clear the current error list.  
        Note that clearing the list invalidates any errorObj handles obtained 
        via the $error->next() method.


   int      code      /* See error code constants above */
   string   routine
   string   message


   errorObj next()
        Returns the next errorObj in the list, or NULL if we reached the end
        of the list.

   This example draws a map and reports all errors generated during
   the draw() call, errors can potentially come from multiple layers.

       $img = $map->draw();
       $error = ms_GetErrorObj();
       while($error && $error->code > 0)
           printf("Error in %s: %s<br>\n", $error->routine, $error->message);
           $error = $error->next();

More information about the mapserver-dev mailing list