As written in the introduction, deep knowledge of how exceptions work is critical to developing in Java. At the simplest of levels, here is how exceptions work:
1) An exceptional condition is detected in a block of code. The code throws an exception:
 
 
try
{
    :
    File file = new File(filename);
    if (!file.exists())
    {
        throw new IOException(“File does not exist” + filename);
    }
    parse(file);
    :
}
catch (IOException e)
{
    logger.error(e);
 }
2) Normal program flow is modified – execution does not continue at the same location.
3) If a try {..} catch(..) block is around the code (or around the call to the function) execution will continue where the exception is caught.
 
 
try
{
    :
    File file = new File(filename);
    if (!file.exists())
    {
        throw new IOException(“File does not exist” + filename);
    }
    parse(file);
    :
}
catch (IOException e)
{
    logger.error(e);
 }
4) Normally the catching block of code handles the exception elegantly.
try
{
    :
}
catch (IOException e)
{
    logger.error(e);
    // There is a chance we parsed the XML OK last time so restore it
    xmlRoot = lastXmlRoot;
 }
Having caught the exception, the block of code can also decide not to deal with the exception at all, and rethrow it to be caught elsewhere.
    :
}
catch (IOException e)
{
    logger.error(e);
    // There is a chance we previously parsed the XML so restore it
    xmlRoot = lastXmlRoot;
 }
catch (XmlParseException e)
{
    // let the framework deal with it
    throw e;
}
