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

    [Java] Come gestire al meglio le eccezioni

    ieri riguardando la classe che rappresenta il mio db mi sono chiesto se quale fosse il metodo migliore per gestire le eccezioni.
    ho letto sia il capitolo del libro che un pò di articoli in giro, ma sono tutti sulla stessa lunghezza d'onda: dicono quali siano gli strumenti ma non come sia meglio usarli.
    quindi chiedo a voi che ne sapete gran lunga più di me.
    vi posto il "modo" in cui le ho gesite fino ad oggi e vi chiedo consiglio su come migliorare il mio approccio.
    questa una estrapolazione della classe db:
    codice:
        public void select(String wName, String wAuthor, String wEditor, String wIsbn) throws ClassNotFoundException, SQLException {
            conn = DBManager.getInstance().getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs = null;
            String sql = null;
            if ((wName.length() == 0) && (wAuthor.length() == 0) && (wEditor.length() == 0) && (wIsbn.length() == 0)) {
                sql = "SELECT * FROM bookv";
            } else if ((wName.length() != 0) && (wAuthor.length() == 0) && (wEditor.length() == 0) && (wIsbn.length() == 0)) {
                sql = "SELECT * FROM bookv WHERE name LIKE '%" + wName + "%'";
            } else if ((wName.length() == 0) && (wAuthor.length() != 0) && (wEditor.length() == 0) && (wIsbn.length() == 0)) {
                sql = "SELECT * FROM bookv WHERE author_name LIKE '%" + wAuthor + "%'";
            } else if ((wName.length() == 0) && (wAuthor.length() == 0) && (wEditor.length() != 0) && (wIsbn.length() == 0)) {
                sql = "SELECT * FROM bookv WHERE editor_name LIKE '%" + wEditor + "%'";
            } else if ((wName.length() == 0) && (wAuthor.length() == 0) && (wEditor.length() == 0) && (wIsbn != null)) {
                sql = "SELECT * FROM bookv WHERE isbn LIKE '%" + wIsbn + "%'";
            }
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                String id = rs.getString("book_id");
                String name = rs.getString("name");
                String author = rs.getString("author_name");
                String editor = rs.getString("editor_name");
                String price = rs.getString("price");
                String isbn = rs.getString("isbn");
                String note = rs.getString("note");
                Object[] riga = {id, name, author, editor, price, isbn, note};
                ((DefaultTableModel) FormMain.getTable().getModel()).addRow(riga);
            }
            rs.close();
            stmt.close();
        }
    
        public void insert(String name, int author_id, int editor_id, double price, String isbn, String note) throws ClassNotFoundException, SQLException {
            String sql = "INSERT book (name, author_id, editor_id, price, isbn, note) VALUES ('" + name + "', " + author_id + ", " + editor_id + ", " + price + ", '" + isbn + "', '" + note + "')";
            conn = DBManager.getInstance().getConnection();
            Statement stmt = conn.createStatement();
            stmt.executeUpdate(sql);
        }
    
        public void update(int id, String name, int author_id, int editor_id, double price, String isbn, String note) throws ClassNotFoundException, SQLException {
            String sql = "UPDATE book SET name = '" + name + "', author_id = " + author_id + ", editor_id = " + editor_id + ", price = " + price + ", isbn = '" + isbn + "', note = '" + note + "' WHERE book_id = " + id;
            conn = DBManager.getInstance().getConnection();
            Statement stmt = conn.createStatement();
            stmt.executeUpdate(sql);
            stmt.close();
        }
    come vedete qua ho usato sempre la clausola throws.
    poi nei punti dove richiamo questi metodo (tipicamente eventi in JFrame):
    codice:
                try {
                    String name = textBookName.getText().toLowerCase().trim();
                    Author author = (Author) comboAuthor.getSelectedItem();
                    int author_id = author.getId();
                    Editor editor = (Editor) comboEditor.getSelectedItem();
                    int editor_id = editor.getId();
                    double price = Double.parseDouble(textAddPrice.getText());
                    String isbn = textIsbn.getText().toLowerCase().trim();
                    String note = areaNote.getText().trim();
                    dbman.insert(name, author_id, editor_id, price, isbn, note);
                    JOptionPane.showMessageDialog(null, "Book added: " + textBookName.getText());
                    textBookName.setText("");
                    comboAuthor.setSelectedIndex(0);
                    comboEditor.setSelectedIndex(0);
                    textAddPrice.setText("");
                    textIsbn.setText("");
                    areaNote.setText("");
                } catch (SQLException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (ClassNotFoundException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
    uso i try/catch.
    adesso: come posso migliorare la gestione delle eccezioni??

  2. #2
    Potresti anche farti una tua classe MiaException con gli atributi che più ti fanno comodo e usando i try e catch , nei catch costruisci la tua nuova classe MiaException con gli atributi che ti servono e la ritorni indietro , cosi da avere nei tuoi eventi la tua eccezione con gli attributi che ti servono.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    per gestire al meglio le eccezioni intendi anche quando gestirle, quando far terminare il programma, quando riandare su, quando ignorarla?
    Il suggerimento di snakeplinsky di consente di avere informazioni personalizzate per la tua eccezione, in modo da come dire gestire un caso particolare generato dal tuo programma.

  4. #4
    Originariamente inviato da valia
    per gestire al meglio le eccezioni intendi anche quando gestirle, quando far terminare il programma, quando riandare su, quando ignorarla?
    Il suggerimento di snakeplinsky di consente di avere informazioni personalizzate per la tua eccezione, in modo da come dire gestire un caso particolare generato dal tuo programma.
    la soluzione snakeplinsky la prendo in cinsiderazione e inizio a crearmi una classe come suggerito.

    diciamo poi che più o meno ho capito quando è meglio intercettare le eccezioni e quando no, e che differenza c'è tra quelle controllate e non.
    più banalmente (proprio terra terra) la mia domanda è quando usare la cluasola throws e quando usare i try/catch.

  5. #5
    Originariamente inviato da fermat
    ...la mia domanda è quando usare la cluasola throws e quando usare i try/catch.
    Non esiste una regola precisa. Con try/catch catturi e gestisci l'eccezione, con la clausola throws la risollevi delegando al metodo invocante la sua gestione.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    su quello purtroppo non c'è una risposta assoluta, dipende molto dalla funzione che stai creando.
    Di solito io gestisco l'eccezione in locale quando il problema non intacca i chiamanti.
    Es. se per vari giri cerco una properties e mi creo un sistema di ricerca generale, non trovare la property ovviamente è un problema, posso lanciare all'esterno l'eccezione e bloccarmi li. Di solito catturo l'eccezione, segnalo di non averla trovata, ma fornisco un default value in modo da proseguire l'esecuzione.
    Tanti casi sono dello stesso tipo, riguardano più che altro l'architettura del programma-

  7. #7
    capito capito.
    grazie come al solito per i preziosi consigli!!!!
    cercherò di trovare il modo migliore per la mi applicazione.
    ciauz!

  8. #8
    Comunque molte volte è soggettiva come cosa, in generale io tendo a propagare le eccezioni dai metodi della logica applicativa, e fare try / catch solo quando raggiungo la parte grafica dell'applicazione. In questo modo è più facile averle sotto controllo e gestire la visualizzazione dell'errore nei vari casi
    Se state chiamando per i piedini mancanti,lasciate il vostro indirizzo,e i piedi di ricambio vi saranno consegnati da mio nipote Jody. E ora, io devo ritornare nel dolce abbraccio della cripta... Ma tornerò!!!

    The Simpson ; AABF08 (Domenica orrenda domenica)

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 © 2025 vBulletin Solutions, Inc. All rights reserved.