Quando usar catch e quando usar throws no tratamento de exceções

A questão não é sobre sintaxe de manipulação de exceção, mas é sobre o local certo para escrever o bloco catch para uma exceção em sua jornada sobre os métodos através da propagação.

public boolean validateUser(String username, String password) throws SQLException {
    Connection conn = dataSource.getConnection();
    boolean result = false;
    PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM USERS WHERE   USERNAME=? AND PASSWORD=?");
    pstmt.setString(1, username);
    pstmt.setString(2, password);
    result = pstmt.executeQuery().next();
    conn.close();
    return result;
}

Presumirmethod1() chamadomethod2() emethod2() chamado método acima. No método acima, se eu manipular a exceção, tenho que retornar um valor. Vamos supor que eu volteifalse após o bloco de captura,method2() entende mal como o nome de usuário ou senha está errado.

Se eu não estou lidando,method2() não receberá nenhum valor e seu bloco catch será executado e o mesmo problema ocorreria emmethod1().

Agora você pode definir onde posso lidar efetivamente com a exceção?