Операторы в блоке catch не выполняются

Я написал фрагмент кода для catch определенного exception с помощью этой ссылки. Это похоже на:

catch (SQLException sqle) {
    // TODO Auto-generated catch block
String sqlMessage = sqle.getMessage();
String sqlState = sqle.getSQLState();
int vendorCode = sqle.getErrorCode();
System.out.println("Exception occurred:");
System.out.println("Message: " + sqlMessage);
System.out.println("SQL state: " + sqlState);
System.out.println("Vendor code: " + vendorCode); 
}

Но я получаю вывод как:

java.sql.SQLException: ORA-00001: unique constraint (SYSTEM.PK_USERID) violated

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:623)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181)
at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:543)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1028)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2888)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2960)
at accessdb.Dao.insertnewuser(Dao.java:32)
at Registration.doGet(Registration.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

если ошибка:

java.sql.SQLException: ORA-00001: уникальное ограничение (SYSTEM.PK_USERID) нарушено

и я получаю вывод как

Exception occurred:
Message: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
The Connection descriptor used by the client was:
localhost:1521:XE
SQL state: null
Vendor code: 0

если ошибка:

Прослушиватель отказался от подключения со следующей ошибкой: ORA-12505, TNS:прослушиватель в настоящее время не знает SID, указанного в дескрипторе подключения. Дескриптор подключения, используемый клиентом, был: localhost:1521:XE.

Почему разница в выводе происходит для одного и того же фрагмента кода?

EDIT: Итак, вот блок try для дальнейшего разъяснения.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Authentication and Logging in The Registered User
    Getset g=new Getset();
    Dao dao=new Dao();
    String userid="";
    String fname="";
//  PrintWriter pw=response.getWriter();
    String loginemail=request.getParameter("loginemail");
    String loginpassword=request.getParameter("loginpassword");
    if(loginemail.equals("")||loginemail.equals(" ")||loginpassword.equals("")||loginpassword.equals(" "))
    {
        response.sendRedirect("WelcomePage.jsp");
    }
    else{
    g.setloginemail(loginemail);
    g.setloginpassword(loginpassword);
    try {
        ResultSet rs=dao.loginauthentication(g);
        while(rs.next())   //Fetching all emails and passwords from user table
        {
            String regemail=rs.getString("regemail");
            String regpassword=rs.getString("regpassword");
            System.out.println(""+regemail);
            if(loginemail.equals(regemail) && (loginpassword.equals(regpassword))==true)
            {   
                System.out.println("55555");
                ResultSet rs1=dao.getnameid(g);
                while(rs1.next())   //GET USERID and name FROM NEWUSER TO USE AS PRIMARY KEY
                {
                     userid=rs1.getString("USERID");
                     fname=rs1.getString("FNAME");
                //  System.out.println(""+userid);

                }

                HttpSession session = request.getSession(true);
                  session.setAttribute("USERID", userid);
                  session.setAttribute("FNAME", fname);
                response.sendRedirect("UserHome.jsp");
                return;
            }
        }  
        if(rs.next()==false){
            System.out.println("caught");
            response.sendRedirect("WelcomePage.jsp");
            return; 
        }

    }

person Mistu4u    schedule 01.08.2012    source источник
comment
Не могли бы вы опубликовать метод insertnewuser?   -  person orique    schedule 01.08.2012
comment
На самом деле это часть проекта J2EE. Все работает нормально, я могу это заверить. Просто я хочу печатать ошибку в браузере пользователю, если он что-то не так вставит. вот почему я экспериментирую с отловом определенных исключений.   -  person Mistu4u    schedule 01.08.2012
comment
В чем именно вопрос?   -  person Jon Lin    schedule 01.08.2012
comment
Вопрос со знаком вопроса Why is the difference in output happening for same piece of code? :)   -  person Mistu4u    schedule 01.08.2012
comment
@JonLin, я не уверен, но я считаю, что вопрос в основном заключается в том, почему выходные данные различаются для двух случаев java.sql.SQLException.   -  person Dilum Ranatunga    schedule 01.08.2012
comment
Из любопытства, как вы получаете эту трассировку стека, если вы перехватываете исключение и не печатаете трассировку стека?   -  person Jon Lin    schedule 01.08.2012
comment
Да, это тоже странно...!! Я не печатаю stacktrace. Я предполагаю, что это может быть проблема tomcat или eclipse.   -  person Mistu4u    schedule 01.08.2012


Ответы (3)


Вы не опубликовали достаточно своего кода, чтобы дать определенный ответ, но это то, что вы бы назвали «обоснованным предположением»: try вашего предложения catch не заключает эту строку кода:

accessdb.Dao.insertnewuser(Dao.java:32)

С вашим новым кодом следующая гипотеза становится еще более правдоподобной: ваш метод insertnewuser имеет собственный блок try-catch, который выглядит так:

try {
  ...prepare an insert statement...
  stmt.executeUpdate(...);
} catch (SQLException e) { e.printStackTrace(); }

Это проглатывает ваше исключение и делает ваш метод нормальным, несмотря на исключение. Решение: удалите весь блок try-catch из этого метода и заставьте метод объявлять throws SQLException.

person Marko Topolnik    schedule 01.08.2012
comment
1. Теперь у вас есть try без catch. Сбивает с толку. 2. В этом коде до сих пор нет доказательств вызова insertnewuser. - person Marko Topolnik; 01.08.2012
comment
получил мою ошибку. Кусок кода для блока catch следует добавить в класс, в котором возникает исключение. Я ловил не из того класса. Спасибо. - person Mistu4u; 01.08.2012
comment
Нет, Субир, возможно, это не лучший выход. Вместо этого удалите весь блок catch в isnertnewuser и дайте всплыть исключению! - person Marko Topolnik; 01.08.2012
comment
Eclipse все равно не разрешает удалять catch. :) - person Mistu4u; 01.08.2012
comment
Затмение тут ни при чем, Субир. Это просто говорит вам, что у вас есть необработанные проверенные исключения. Просто объявите в своем методе throws SQLException, это одно из двух предлагаемых быстрых исправлений. - person Marko Topolnik; 01.08.2012

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

С одной стороны, вы получаете желаемый результат, когда выдается SQLException при попытке подключения к серверу БД. Вероятно, это означает, что вы поместили свой блок catch в кусок кода, который управляет подключением к вашей БД.

С другой стороны, вы получаете нежелательный результат при попытке insertnewuser, и БД вызывает ошибку ORA-00001, которая, в свою очередь, вызывает ошибку SQLException. Это означает, что соединение с базой данных выполнено успешно, а операция вставки — нет.

У вас есть две структуры try-catch?

person orique    schedule 01.08.2012

Позвольте мне тоже присоединиться к игре «давайте угадаем код»: вы используете некоторую абстракцию персистентности и не вызываете flush()/ormFlush()/what have you ->, поэтому нет гарантии немедленной вставки ->, поэтому SQLException генерируется всегда и везде?

person pafau k.    schedule 01.08.2012
comment
Я могу заверить вас, что вставка происходит сразу после регистрации пользователя. Я создаю исключения охотно, чтобы конкретно поймать исключения. - person Mistu4u; 01.08.2012