Código sem sentido:

try {
    fazerAlgumaCoisa();
} catch(ExceptionA e) {
    log.error(e.getMessage(), e);
    throw e;
} catch(ExceptionB e) {
    log.error(e.getMessage(), e);
    throw e;
}

Este código somente captura a exceção para escrever no log e relança a mesma exceção. Isto não faz sentido. Deixe o chamador decidir se a mensagem é importante para logar e remova todo o bloco try/catch. Isto somente é útil quando você sabe que o chamador não “loga”. Que é o caso se o método é chamado por um framework que não está sob o seu controle. Se você “loga” porque o chamador não tem informação suficiente para “logar”, então a classe de exceção que você está usando é inadequada: passe toda a informação necessária através da exceção. É para isso que elas servem!