SAX: Error Reporting (question 4 of 10)

David Megginson ak117 at freenet.carleton.ca
Sat Jan 3 17:55:28 GMT 1998


Should SAX treat errors as events?  If so, should it distinguish fatal
errors from warnings or non-fatal errors?

  public void warning (String message, String systemID, int line);
  public void fatalError (String message, String systemID, int line);

There is an important distinction here: warnings are strictly
informative, and may be useful for debugging, i.e.

  WARNING: assuming UTF-8 encoding.

Normally, these would go to STDERR or to a log, and people would view
them only if they were trying to track down a problem.  Fatal errors,
on the other hand, should ordinarily stop processing and fling
themselves in the user's face:

  FATAL ERROR: tag mismatch: end tag "foo" for element "bar"

Normally, these would throw an error or exception, and the programmer
might want to display the message in a dialog box.


CON
---

- these methods will make SAX slightly larger;

- there is no XML requirement to report non-fatal errors at all;

- Java already has throwable errors and exceptions, which provide a
  more elegant method for error reporting.


PRO
---

- some OO languages do not have throwable errors and exceptions; this
  approach should be simple enough to work with all of them;

- exceptions are not always a good idea, since it might not be
  possible to restart the parser when one is caught;

- it is useful to be able to warn the user about possible problems
  without causing a fatal error (hence the warning method);

- there can be default implementations in XmlAppBase, so users can
  ignore these if they wish.


MY RECOMMENDATION
-----------------

Yes to both.

We can have the following default implementations in XmlAppBase:

  public void warning (String message, String systemID, int line)
  {
    System.err.println("WARNING (" + systemID + ',' + line + "): " + message);
  }

  public void fatalError (String message, String systemID, int line)
  {
    throw new Error (systemID + ',' + line + ": " + message);
  }

These would be appropriate for most simple applications, but could
easily be overridden for more complicated ones derived form
XmlAppBase.


FURTHER CONSIDERATIONS
----------------------

If we decide to implement startEntity() and endEntity(), then the
systemID argument to these methods will be redundant (the current URI
will always be known); in that case, should we still leave the
systemID argument in for convenience?

Do we need a 'column' argument as well as a 'line' argument, or is
'line' enough?  I don't know if all parsers track the current column,
but we could define a behaviour for those that do not (such as
reporting the column as -1).


All the best,


David

-- 
David Megginson                 ak117 at freenet.carleton.ca
Microstar Software Ltd.         dmeggins at microstar.com
      http://home.sprynet.com/sprynet/dmeggins/

xml-dev: A list for W3C XML Developers. To post, mailto:xml-dev at ic.ac.uk
Archived as: http://www.lists.ic.ac.uk/hypermail/xml-dev/
To (un)subscribe, mailto:majordomo at ic.ac.uk the following message;
(un)subscribe xml-dev
To subscribe to the digests, mailto:majordomo at ic.ac.uk the following message;
subscribe xml-dev-digest
List coordinator, Henry Rzepa (mailto:rzepa at ic.ac.uk)




More information about the Xml-dev mailing list