powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / расстановка try-catch
12 сообщений из 12, страница 1 из 1
расстановка try-catch
    #33614188
Java_start
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
посмотрите пожалуйста правильно ли расставлены try-catch.
Начала учить Java и не совсем понимаю эту их систему с Exceptions.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
 public   static   void  main(String[] args)  throws  Exception
{
           //Load the JDBC driver
            try  
           { 
                 Class .forName("com.mysql.jdbc.Driver").newInstance(); 
           } 
            catch  (Exception e) 
           { 
                System.err.println("Unable to load driver."); 
                e.printStackTrace(); 
           } 
           
                      
            try  
           { 
                System.out.println("* Connecting..."); 
                String url = "jdbc:mysql://"+config.hostname+":"+"3306"+"/"+"db_name"; 
                Connection conn = DriverManager.getConnection(url, config.user, config.password);
                  
                   Create c =  new  Create();
                   c.Create_Tables(conn);
           } 
            catch  (SQLException sqle)
           { 
	            System.out.println("SQLException: " + sqle.getMessage()); 
	            System.out.println("SQLState: " + sqle.getSQLState()); 
	            System.out.println("VendorError: " + sqle.getErrorCode()); 
	            sqle.printStackTrace();
	            System.exit( 1 );
           }
            finally 
           {
                   System.out.println("* Datenbank-Verbindung beenden"); 
	      conn.close();//здесь у меня ошибка: cannot find symbol conn. поняла почему - т.к. Connection conn в блоке try{}, но ведь это необходимо (в try{}), т.к.  этот метод исключение выбрасывает... как решить такую проблему?

           }     
}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 public   class  Create 
{
      public   void  Create_Tables(Connection Con)  throws  java.sql.SQLException
     {
                Statement stmt = Con.createStatement(); //или с обьявлением Connection conn так же, как и здеь поступить - т.е. вне try{} обявить?           
  	  
                try 
               {
                     CreateTable(stmt);
                }
                 catch (Exception e)
               {
                     throw   new  SQLException();
               }
                finally 
              {
               stmt.close(); 
               }

    }
}

...
Рейтинг: 0 / 0
расстановка try-catch
    #33614244
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
import java.sql.Connection;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.DriverManager;


// свое исключение
class MyCustomException extends Exception {
public MyCustomException(Throwable t) { // можно создать и другие конструкторы
super(t);
}
}

public class Create { // есть проблемы с форматированием. посмотри Sun Code Conventions
// желательно кидать свои исключения
public void Create_Tables(Connection conn) throws MyCustomException {
Statement stmt = null;

try {
stmt = conn.createStatement();

// обычно работа с stmt идет здесь же
} catch(SQLException e) { // указываем самое нижнее по иерархии генерируемое исключение
throw new MyCustomException(e); // нехорошо создавать SQLException самому
} finally {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// ничего не делаем, но можно и сгенерить, но тогда потеряется первое исключение если было
}
}
}
}

public static void main(String[] args) throws Exception {
//Load the JDBC driver
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception e) {
System.err.println("Unable to load driver.");
e.printStackTrace();
}

Connection conn = null;
try {
System.out.println("* Connecting...");
String url = "jdbc:mysql://" + config.hostname + ":" + "3306" + "/" + "db_name";
conn = DriverManager.getConnection(url, config.user, config.password);

Create c = new Create();
c.Create_Tables(conn);
} catch (MyCustomException e) {
System.out.println("SQLException: " + e.getMessage());
e.printStackTrace();
// System.exit(1); и так выйдет
} finally {
System.out.println("* Datenbank-Verbindung beenden");
if (conn != null) {
try {
conn.close(); // ошибки уже нет ;)
} catch (SQLException e) {
// ничего не делаем, но можно и сгенерить, но тогда потеряется первое исключение если было
}
}
}
}
}
...
Рейтинг: 0 / 0
расстановка try-catch
    #33614249
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непосмотрел на форматирование. Так лучше

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
 import  java.sql.Connection;
 import  java.sql.Statement;
 import  java.sql.SQLException;
 import  java.sql.DriverManager;


// свое исключение
 class  MyCustomException  extends  Exception {
     public  MyCustomException(Throwable t) { // можно создать и другие конструкторы
         super (t);
    }
}

 public   class  Create { // есть проблемы с форматированием. посмотри Sun Code Conventions
    // желательно кидать свои исключения
     public   void  Create_Tables(Connection conn)  throws  MyCustomException {
        Statement stmt =  null ;

         try  {
            stmt = conn.createStatement();

            // обычно работа с stmt идет здесь же
        }  catch (SQLException e) {   // указываем самое нижнее по иерархии генерируемое исключение
             throw   new  MyCustomException(e);  // нехорошо создавать SQLException самому
        }  finally  {
             if  (stmt !=  null ) {
                 try  {
                    stmt.close();
                }  catch  (SQLException e) {
                    // ничего не делаем, но можно и сгенерить, но тогда потеряется первое исключение если было
                }
            }
        }
    }

     public   static   void  main(String[] args)  throws  Exception {
        //Load the JDBC driver
         try  {
             Class .forName("com.mysql.jdbc.Driver").newInstance();
        }  catch  (Exception e) {
            System.err.println("Unable to load driver.");
            e.printStackTrace();
        }

        Connection conn =  null ;
         try  {
            System.out.println("* Connecting...");
            String url = "jdbc:mysql://" + config.hostname + ":" + "3306" + "/" + "db_name";
            conn = DriverManager.getConnection(url, config.user, config.password);

            Create c =  new  Create();
            c.Create_Tables(conn);
        }  catch  (MyCustomException e) {
            System.out.println("SQLException: " + e.getMessage());
            e.printStackTrace();
            // System.exit(1); и так выйдет
        }  finally  {
            System.out.println("* Datenbank-Verbindung beenden");
             if  (conn !=  null ) {
                 try  {
                    conn.close(); // ошибки уже нет ;)
                }  catch  (SQLException e) {
                    // ничего не делаем, но можно и сгенерить, но тогда потеряется первое исключение если было
                }
            } 
        }
    }
}
...
Рейтинг: 0 / 0
расстановка try-catch
    #33614257
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К тому же main() может уже ничего не кидать
...
Рейтинг: 0 / 0
расстановка try-catch
    #33614507
Java_start
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2BlackWall: как хорошо обьяснил, спасибо большое! Буду теперь по примеру учиться.
...
Рейтинг: 0 / 0
расстановка try-catch
    #33614546
Java_start
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2BlackWall: почему лучше свои исключения кидать?
...
Рейтинг: 0 / 0
расстановка try-catch
    #33614642
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Потому что исключение вроде SQLException является характерным для кода, работающего с БД, а его появление или перехват на более высоком уровне, скажем, в коде GUI, не является хорошим тоном. Код более высокого уровня не должен вдаваться в подробности реализации работы с БД, он все равно не сможет корректно обработать ошибку. Поэтому исключения вроде SQLException принято "оборачивать" в другие, более общие, скажем глобальные для данного приложения. Т.е. в случае ошибок сети, когда генерируется IOException, его тоже следует "обернуть", выкинуть и обработать на соответствующем уровне. Ну а обработка для GUI-приложения скорее всего будет заключаться в выводе окошка "Ошибка тра-ля-ля", возможно с деталями вроде стека исключений. Тут можно посоветовать чаще смотреть на чужой код, как для поиска своих, так и чужих ошибок.
...
Рейтинг: 0 / 0
расстановка try-catch
    #33614772
Java_start
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackWall, если вдруг Вам попадётся кусочек хорошего кода, где представлена правильная обработка ошибок, очень буду благодарна если запостите в эту темку. Т.к., к сожалению, чужой код у меня посмотреть нет возможности :( Только по книжкам приходится учиться, а там, как правило поверхностно обьяснено.
...
Рейтинг: 0 / 0
расстановка try-catch
    #33614921
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большой такой кусок кода ;) Целый проект. Форум на Java, по аналогии с phpBB. Если и не для изучения технологий, то для языка может быть полезным.
https://javabb.dev.java.net/files/documents/1976/21434/javabb_073.zip
...
Рейтинг: 0 / 0
расстановка try-catch
    #33615030
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Java_startпопадётся кусочек хорошего кода, где представлена правильная обработка ошибок

Вообще-то об этом понаписано много.... Вот полезные статьи:

http://bdn.borland.com/article/0,1410,29664,00.html
http://www.phptr.com/articles/printerfriendly.asp?p=433387&rl=1

А кроме того, в дополнение к сказанному BlackWall, хочу заметить, что в правильной иерархии кода (а код всегда иерархичен - есть низкоуровневые операции типа оступа к БД или к файлам, есть промежуточные типа обработки, есть высокоуровневые типа GUI или той же функции main() ) исключение, как правило, не должно перескакивать уровни - за исключением, возможно, отдельных классов критических исключений. Функция более низкого уровня должна возвращать "наверх" либо результат, либо сообщение об ошибке, а с исключениями разбираться "внутри", при формировании результата и сообщения об ошибке. В принципе, конечно, сообщение об ошибке может быть послано путем "оборачивания" в пользовательские исключения, как рекомендует BlackWall, но такой подход требует тщательности. Я лично его избегаю везде, где это не имеет явного смысла.
...
Рейтинг: 0 / 0
расстановка try-catch
    #33615201
Java_start
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, буду читать и смотреть код.
...
Рейтинг: 0 / 0
расстановка try-catch
    #33615204
BlackWall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оборачивание - это обычная практика. Нет необходимости просматривать всю цепочку исключений на верхнем уровне, но сохранение исходного исключения в оборачивающем полезно как минимум для логирования. А так все верно.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / расстановка try-catch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]