Java Exception Handling

From MPDLMediaWiki
Jump to navigation Jump to search

Problem description[edit]

Modules need dependencies of other modules only because of their exception classes[edit]

From validation/ItemValidating:

   String validateItemXml(final String itemXml) throws
           ValidationSchemaNotFoundException,
           TechnicalException;

From importmanager/ImportHandler:

   byte[] doFetch(String sourceName, String identifier) throws FileNotFoundException, 
           IdentifierNotRecognisedException, 
           SourceNotAvailableException, 
           TechnicalException,
           FormatNotRecognizedException;

Stacktraces are sometimes swallowed[edit]

   try 
   {
       ...					
   } 
   catch (MalformedURLException e) 
   {LOGGER.error("Error when replacing regex in fetching URL"); e.printStackTrace(); }
   catch(UnsupportedEncodingException e)
   {e.printStackTrace();}

   try 
   {
       ...					
   } 
   catch (JiBXException e) 
   {
       e.getCause();
   }

Sometimes, excessive stacktraces are shown, even without useful information[edit]

Example from coreservices: File:Exception1.txt

Logger.error, System.out and e.printStackTrace are mixed up happily[edit]

see above

No distinction between exceptions and errors/checked and unchecked exceptions[edit]

Compare Exception and Error

Conclusion[edit]

Distinguish between repairable exceptions and errors[edit]

Decide whether your module is able to fix the exception (take default values, look somewhere else, try again, ...) or not.

Prefer unchecked exceptions inside a module[edit]

Only catch repairable exceptions[edit]

Inside a module, always throw errors up as they are[edit]

When catching exceptions, log appropriately[edit]

  • use log4j, not System.out
  • use the two-argument methods:
    • logger.error("Error geting server.name property", ex);
    • logger.error("Error geting server.name property"); --> Exception information is lost
    • logger.error(ex); --> Only ex.toString() is logged, other exception information is lost

Do not throw self-defined exceptions without a surplus[edit]

If the exception name is the only gain a self-defined exception brings (e.g. IncorrectArxivIdException), a generic Exception given an appropriate message is better (e.g. new IllegalArgumentException("Incorrect arXiv id " + arxivId))

Between modules, throw only generic exceptions[edit]

e.g. IllegalArgumentException, IllegalStateException, RuntimeException

Links[edit]