2014-01-05 3 views
0

я следующий метод:Java: STDERR и поймал исключение

public void doQuery(String q){ 
     try{ 
      java.sql.Statement statement.execute(q); 
     } catch (SQLException e){ 
      System.out.println("query: "+q); 
      e.printStackTrace(); 
     } 
    } 

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

Мой вопрос в том, будет ли этот код делать то, что я намерен? Похоже, что эта программа заканчивается из-за этой ошибки - я вижу трассировку стека в stderr, которую я не ожидал увидеть.

Спасибо,

Джефф

+0

Как вы думаете, 'e.printStackTrace();' делает? – Henry

+0

вы можете сделать замену в своей строке q ... не так ли? –

+1

это не компилирует 'java.sql.Statement statement.execute (q);' не является допустимым оператором [:)] –

ответ

1

Да, ваш код будет делать то, что вы хотите, на каких-либо исключений SQL вы поймать его, напечатать запрос, а затем распечатать трассировки стека в поток ошибок.

Если вы не хотите печатать его в потоке ошибок, удалите команду.

Предлагаю вам не печатать ваш запрос. Это не является хорошей практикой, поскольку потенциальные злоумышленники могут использовать знания о вашей БД.

Если ваша программа неожиданно завершилась из-за необработанного исключения, я думаю, что ваше выделение не относится к типу SqlException. Чтобы убедиться, что вы поймаете все исключения, вы можете определить другие блоки catch, чтобы поймать более общие типы Исключений.

Вы можете сделать это следующим образом:

try 
    { 
     java.sql.Statement statement.execute(q); 
    } 
    catch (SQLException e){ 
     System.out.println("DB Exception"); // Put breakpoint here 
     e.printStackTrace(); 
    } 
    catch(Exception e) 
    { 
     System.out.println("General Exception"); // Put breakpoint here 
     e.printStackTrace(); 
    } 

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

+0

Спасибо: два вопроса: – Jeff

+0

Спасибо. Я думал, что трассировка стека будет напечатана на стандартный вывод. Я думаю, вы говорите, что, так как я улавливаю Exceptionable, это не причина, по которой программа заканчивается, но я не вижу никакой другой причины в stderr, которую она завершает. Я собираюсь попробовать catch Exception вместо SQLException в блоке catch. – Jeff

+0

Обычно лучше обрабатывать определенные типы исключений вместо более общих. –

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