Código difícil de depurar:

try {
    fazerAlgumaCoisa();
} catch(Exception e) {
    log.fatal("Não foi possível fazer "
            + "alguma coisa.");
}
fazerMaisCoisa();

Existem dois problemas com este pequeno código. O primeiro é que se esta é realmente uma condição fatal, então o método deveria abortar e notificar o chamador com a exceção apropriada (então por que tratá-la?) Dificilmente você pode continuar depois de uma condição fatal. Segundo: este código é muito difícil de depurar porque a causa da falha é perdida. Exceções são objetos que carregam informação detalhada sobre onde o erro ocorreu e o que o causou. As subclasses de Exception podem carregar muita informação extra que o chamador pode usar para lidar com a situação apropriadamente. É muito mais que um simples código de erro (tão popular no mundo do C). Se você quer tratar exceções em alto nível, então ao menos registre em log a mensagem e a pilha de chamada. Você não deve ver as exceções como um mal necessário. Elas são uma valiosa ferramenta para tratamento de erro.

Código melhor:

try {
    fazerAlgumaCoisa();
} catch(Exception e) {
    throw new MinhaRuntimeException(
            e.getMessage(), e);
}
fazerMaisCoisa();