Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    uso di try&catch in una pagina jsp che esegue una stored procedure

    Ho una pagina jsp che svolge questi punti:
    1-si connette ad un db oracle
    2-svolge una stored procedure senza committare
    3-fa un controllo degli errori della procedura(con una select su una tabella relativa agli errori)
    4-se è tutto ok fa il commit altrimenti il rollback
    5-elimina(in ogni caso) da una tabella temporanea dei dati

    Metto qui sotto la pagina per farvi vedere come ho gestito le eccezioni.
    La mia richiesta(preghiera):Se qualcuno mi dice se +o- è corretto e in cosa ho sbagliato.
    Ho visto che in jsp si puo' mettere una pagina di errore unica(usando page errorPage = "PaginaErrore.jsp") senza dover gestire le eccezioni nel codice: quando è utile??

    grazie mille


    esempio.jsp:
    codice:
    Connection conn = null;
    	
    try  //1°try,in modo che se la connessione salta vado subito al catch relativo e chiudo
    {	
    	conn = DriverManager.getConnection
                      ("jdbc:oracle:ZZZZZZZ");
    	try //2°try, relativo alla procedura sql
    	{	
    			conn.setAutoCommit(false);
    			//faccio partire la procedura sql
    			String s="begin commit; end;";
    			java.sql.Statement stmt2= conn.createStatement();
    			stmt2.execute(s); 
    			s="begin excel.carica_skillcard('"+idSessione+"',"+ idT +"); end;";
    			java.sql.Statement stmt1 = conn.createStatement();
    			stmt1.execute(s);
    			//Controllo l'esistenza di errori nella procedura con una select da una tabella errori
    			//In caso non ci siano errori eseguo il commit			
    			if(errori==0)
    			{	
    				s="begin commit; end;";
    				java.sql.Statement stmt221= conn.createStatement();
    				stmt221.execute(s); 
    			}
    			//In caso di errori eseguo il rollback
    			else
    			{	
    				java.sql.Statement stmt3= conn.createStatement();
    				stmt3.execute(s); 
    			}
    	}
    			
    			//In caso sia accaduto qualche intoppo eseguo comunque un rollback tramite il catche che segue   
    	catch(SQLException e2) //catch del 2°try
    	{	
    			String s2="begin rollback; end;";
    			java.sql.Statement stmtX= conn.createStatement();
    			stmtX.execute(s2);
    			out.println("Si è verificato un errore durante l'esecuzione);
    			System.out.println(e2.getMessage());
    	}
    			
    			//elimino da una tabella temporanea dei dati(operazione che devo fare cmq, anche se non è andato a buon fine la procedura, per questo messa in un altro try(il 3*)
    	try //3*try
    	{
    			String sql121 = "DELETE FROM EXCEL_VENDITA_SKILLCARD WHERE SESSIONID='"+ idSess+"'";
    			java.sql.Statement stmt111 = conn.createStatement();
    			java.sql.ResultSet rsX1 = stmt111.executeQuery(sql121);
    	}
    	catch(SQLException e3)//catch del 3°try
    	{	
    			out.println("Si è verificato un errore durante l'esecuzione);
    			System.out.println(e3.getMessage());
    	}
    	
    }
    catch(SQLException e1)//catch del 1°try
    {	
    	out.println("Si è verificato un errore durante l'esecuzione);
    	System.out.println(e1.getMessage());
    }
    finally//finally del 1°try che chiude cmq le connessioni
    {
    	//chiusura connessioni
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    Non ho capito bene che tipo di problema hai.Cos'e' che non funziona?

    Comunque, in generale, ti sconsiglio questa tecnica di indentare try/catch uno dentro all'altro se non strettamente necessario.

    Per il resto, posta l'errore

    ps.:usa i tag <code> che migliorano di molto la leggibilità del tuo codice

  3. #3
    va tutto ok.
    volevo solo sapere se andava bene l'utilizzo di try&catch.

    ho indentato il secondo e il terzo try nel primo in modo che se andava male la connessione uscivo subito da tutto.

    se hai qualche suggerimento e me lo motivi tene sono grato(il primo-code- lho già seguito)

    ciao, grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    Per quanto riguarda come lo hai utilizzato mi pare che sia tutto a posto...del resto il concetto è semplice:

    codice:
    try{
    //codice che può generare eccezioni,
    //le quali eccezioni sei interessato a gestire nel metodo corrente
    }
    catch (Eccezione){
    //cosa devo fare se qualcosa va storto - il blocco try viene interrotto nel punto che ha generato l'eccezione
    }
    
    finally{//questo viene eseguito sempre, dopo i rispettivi try&catch}
    Per quanto riguarda il nidificare try e catch lo trovo inutile , perche in ogni caso l'esecuzione dell'intero blocco sarebbe interrotta in caso di errore durante il caricamento della connessione

    voglio dire, se tu scrivi
    try{conn = blablabal; try{statement blablabla;} catch(...){}}catch(...)

    nel tuo caso è la stessa cosa di scrivere
    try{TUTTO} catch(TUTTO) {}

    io in genere faccio cosi, alla fine per distinguere tra le varie eccezioni puoi fare una cosa di questo tipo:

    catch (Throwable ex) {
    if (ex instanceof SQLException) //gestione
    if (ex instanceof IOException) //gestione
    }

    Diversamente, devi nidificare per forza quando in una catch sei costretto ad usare un metodo che a sua volta può generare un altra eccezione

  5. #5
    beh ma il catch della prima try fa cose diverse del catch della seconda try che esegue anche un rollback che nel primo catch mi sembrerebbe inutile no?
    mentre il terzo catch è separato dal secondo(oltre che per il motivo di cui sopra) anche perchè il codice nel terzo try voglio che venga eseguito cmq, indipendentemente da come va il try precdente(il secondo).
    .

    non ti convince?

  6. #6
    forse quello che è compreso nel terzo try andrebbe eseguito in unaltra pagina a cui si arriva con un redirect(visto che è totalmente slegato dal resto) e in questa fare un unico try e catch comprendente anche la connessione.

    in tal maniera eviterei di nidificare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.