2016-04-08 2 views
3

У меня есть одноконтактный объект-коннектор, который помогает подключиться к базе данных mysql.Правильный способ обработки исключений в Java

public class Connector{ 
     private Connector(){ 

      } 
      public static Connector getInstance(){ 
       if(unique == null) unique = new Connector(); 
       return unique; 
      } 

      public void connect() throws SQLException{ 

       conn = (Connection) DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD); 
       if(conn != null) System.out.println("Connected"); 
      } 

      public void close() throws SQLException{ 
       if(conn != null) conn.close(); 

      } 
    } 

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

Connector connector = Connector.getInstance(); 
     try { 
      connector.connect(); 
     } catch (SQLException e) { 
      System.out.println("Connected now"); 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally { 
      connector.close(); 
      System.out.println("Connection closed"); 
     } 

Теперь разъем не компилировать как он хочет, чтобы я обернуть наконец в попытке поймать, так как метод close() также вызывает исключение. Это означало бы, что мне придется писать код вроде.

finally { 
      try { 
       connector.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.out.println("Connection closed"); 
     } 

Это как-то выглядит не так. Каков правильный способ справиться с этой ситуацией. Спасибо в ожидании.

+2

нет «правильного» способа, все зависит от ваших потребностей и требований. – Stultuske

+0

@Stultuske, так что это код в порядке или есть более элегантный способ справиться с этим исключением. – Zeus

+0

Фактически вы находите, наконец, такие блоки в большом количестве библиотек, иногда с помощью метода, который обертывает внутренний try-catch, например Apache Commons IOUtils 'closeQuietly (...)'. – Thomas

ответ

3

Используйте decorator pattern для обработки this. Вы можете изменить класс Connector для реализации AutoCloseable (который имеет только один способ: public void close()) и убедитесь, что исключение не выбрано. Затем вы можете использовать try-with-resources при работе с Connector.

+0

Это предполагает java> 6, но в остальном решение я бы предложил сам. – trappski

+0

@trappski Это правда, но я считаю, что try-with-resources настолько элегантнее, чем старый способ, и помогает в управлении ресурсами, которые я просто не мог с собой поделать. – callyalater

2

Вы можете скрыть исключение и изменить его логическое значение на close способе Connector класса

public boolean close() { 
    try 
    { 
     if(conn != null) conn.close(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
    return false; 
    } 
} 
+1

Я не уверен, понял ли я это. Не могли бы вы предоставить фрагмент кода. – Zeus

+0

Вы имели в виду Can not or can? – Zeus

+0

может, извините за ошибку ... – Plebios

1

Многие библиотеки могут закрывать скрытые объекты Closeables (guava, apache).

С гуавы вы могли бы сделать что-то подобное:

Closeables.closeQuietly(something); 

Он призывает закрыть() в примерочных поймать блока, но выглядит лучше. Он также проверяет, является ли ваш Closeable нулевым, поэтому вам не нужно беспокоиться об этом.

Смежные вопросы