как улучшить этот код с исключениями try-catch - PullRequest
0 голосов
/ 09 марта 2012

У меня есть этот Java-код, который является частью управляемого компонента, который используется для отображения данных из базы данных в таблицу JSF.

//connect to DB and get customer list
public List<Dashboard> getDashboardList() throws SQLException {

    if (ds == null) {
        throw new SQLException("Can't get data source");
    }

    //get database connection
    Connection con = ds.getConnection();

    if (con == null) {
        throw new SQLException("Can't get database connection");
    }

    PreparedStatement ps = con.prepareStatement(
            "SELECT * from GLOBALSETTINGS");

    //get customer data from database
    ResultSet result = ps.executeQuery();

    List<Dashboard> list = new ArrayList<Dashboard>();

    while (result.next()) {
        Dashboard cust = new Dashboard();

        cust.setUser(result.getString("SessionTTL"));
        cust.setPassword(result.getString("MAXACTIVEUSERS"));


        //store all data into a List
        list.add(cust);
    }
    ps.close();
    con.close();
    return list;        
}

Я хочу улучшить этот код и вставить операторы try catch. Как правильно это сделать?

Ответы [ 4 ]

2 голосов
/ 09 марта 2012

Почему вы хотите это сделать?Если возникает какая-либо ошибка, метод на самом деле не имеет, что делать, поэтому в таких случаях представляется целесообразным выдать исключение.

Единственное, что я хотел бы изменить, - это добавить метод finally для закрытия соединений:

try {
    PreparedStatement ps = con.prepareStatement(
            "SELECT * from GLOBALSETTINGS");

    //get customer data from database
    ResultSet result = ps.executeQuery();

    List<Dashboard> list = new ArrayList<Dashboard>();

    while (result.next()) {
        Dashboard cust = new Dashboard();

        cust.setUser(result.getString("SessionTTL"));
        cust.setPassword(result.getString("MAXACTIVEUSERS"));


        //store all data into a List
        list.add(cust);
    }
}
finally {
    ps.close();
    con.close();
}
2 голосов
/ 09 марта 2012

как улучшить этот код с помощью исключений try-catch?

Вы можете просмотреть заголовок вашего вопроса, поскольку вы не спрашиваете об улучшении , но, возможно, организации. На основании вашего кода я изменил ваш метод, чтобы он выглядел чище организован о ловле исключений.

public List<Dashboard> getDashboardList(DataSource ds)
{   
    List<Dashboard> list = new ArrayList<Dashboard>();
    Connection con = null;
    PreparedStatement ps = null;
    try
    {
        con = ds.getConnection();
        ps = con.prepareStatement("SELECT * from GLOBALSETTINGS");
        //get customer data from database
        ResultSet result = ps.executeQuery();
        while (result.next())
        {
            Dashboard cust = new Dashboard();
            cust.setUser(result.getString("SessionTTL"));
            cust.setPassword(result.getString("MAXACTIVEUSERS"));
            list.add(cust);
        }
    }
    catch(Exception e1)
    {
        // Log the exception.
    }
    finally
    {
        try
        {
             if(ps != null)
                  ps.close();
             if(con != null)
                  con.close();
        }
        catch(Exception e2)
        {
            // Log the exception.
        }
    }
    return list; 
}
1 голос
/ 09 марта 2012

Это довольно простой Java-материал, поэтому я рекомендую взять книгу и изучить основы.Несмотря на это, я обычно делаю что-то вроде следующего:

Connection conn = null;
try {
  // DB code
} catch (SQLException se) {
  log.error("Experienced SQLException in method foo", se);
  FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Oops!  You messed up!", null);
  FacesContext.getCurrentInstance().addMessage(null, msg);
} finally {
  if (conn != null && conn.isOpen()) {
    try {
      conn.close();
    } catch (SQLException see) {
      log.error("Connection can't be closed!");
      // Faces message or something like it
    }
}
1 голос
/ 09 марта 2012

Не уверен, что вы имеете в виду под правильным, но если вы удалите верхний throws SQLException из вашего метода, ваша IDE отобразит всплывающую подсказку для любого не перехваченного исключения, и вы можете таким образом автоматически вставить каждое из пропущенных.

...