jdbc exception handling how handle sql exceptions
java πώς να φτιάξετε μια λίστα
Αυτός ο οδηγός χειρισμού εξαίρεσης JDBC εξηγεί τρόπους χειρισμού εξαιρέσεων SQL με τη βοήθεια παραδειγμάτων προγραμματισμού:
Στο Διαχείριση συναλλαγών JDBC φροντιστήριο του Εκμάθηση σειράς JDBC , μάθαμε τους τύπους συναλλαγών JDBC, τους τύπους δεδομένων, τις μεθόδους διαχείρισης συναλλαγών και τον τρόπο χρήσης τους σε προγράμματα Java.
Σε αυτό το σεμινάριο, θα μάθουμε για τις Εξαιρέσεις στο JDBC και πώς να τις χειριστούμε. Στο JDBC, εάν η εξαίρεση προέκυψε λόγω συνδεσιμότητας βάσης δεδομένων ή οτιδήποτε σχετίζεται με το DB, θα εμπίπτει στο SQLException. Εδώ, θα δούμε περισσότερες πληροφορίες σχετικά με το SQLExceptions.
Ας ετοιμαστούμε να μάθουμε για τις Εξαιρέσεις στο JDBC.
Τι θα μάθετε:
Χειρισμός εξαίρεσης JDBC
Εξαιρέσεις συμβαίνουν όταν υπάρχει σφάλμα ή προειδοποίηση κατά την εκτέλεση του προγράμματος. Όταν προκύψει εξαίρεση, η κανονική ροή του προγράμματος θα διαταραχθεί και το πρόγραμμα θα τερματιστεί ασυνήθιστα. Το καλό με την εξαίρεση είναι ότι μπορούμε να το χειριστούμε χρησιμοποιώντας ένα μπλοκ try-catch ή ρίχνει μια λέξη-κλειδί. Όλες οι εξαιρέσεις και τα λάθη είναι οι υποκατηγορίες της κατηγορίας Throwable. Η κατηγορία Throwable είναι η βασική κατηγορία όλων των εξαιρέσεων και σφαλμάτων.
Λέξεις-κλειδιά χειρισμού εξαιρέσεων Java
Υπάρχουν πέντε λέξεις-κλειδιά στο Java Exception Handling. Έχουν ως εξής:
- Προσπαθήστε: Οι δηλώσεις προγράμματος που μπορούν να αυξήσουν την εξαίρεση θα πρέπει να διατηρούνται εντός ενός μπλοκ δοκιμής.
- Σύλληψη: Εάν προκύψει οποιαδήποτε εξαίρεση στο μπλοκ δοκιμής, θα απορριφθεί. Μπορούμε να πιάσουμε αυτήν την εξαίρεση χρησιμοποιώντας το μπλοκ Catch και να το χειριστούμε στον κώδικα.
- Βολή: Οι εξαιρέσεις που δημιουργούνται από το σύστημα ρίχνονται αυτόματα από την JVM. Για να ρίξουμε με μη αυτόματο τρόπο τις εξαιρέσεις, πρέπει να χρησιμοποιήσουμε μια λέξη-κλειδί ρίψη.
- Ρίχνει: Οποιαδήποτε εξαίρεση που έχει απορριφθεί από μια μέθοδο θα πρέπει να καθορίζεται από μια ρήτρα ρίψης.
- Τελικά: Τυχόν δηλώσεις προγράμματος που πρέπει να εκτελεστούν μετά το μπλοκ δοκιμής θα πρέπει να διατηρούνται στο μπλοκ επιτέλους.
>> Κάντε κλικ εδώ για περισσότερες πληροφορίες σχετικά με τις εξαιρέσεις στην Java.
SQLException
Στο JDBC, ενδέχεται να λάβουμε εξαιρέσεις κατά την εκτέλεση ή τη δημιουργία του ερωτήματος. Οι εξαιρέσεις που προκύπτουν λόγω της βάσης δεδομένων ή του προγράμματος οδήγησης υπάγονται στην εξαίρεση SQL. Χρησιμοποιώντας το Exception handling, μπορούμε να χειριστούμε την SQL Exception όπως χειριζόμαστε την κανονική εξαίρεση.
Το SQLException διατίθεται στο πακέτο java.sql. Επεκτείνει την κατηγορία Εξαίρεσης, πράγμα που σημαίνει ότι μπορούμε να χρησιμοποιήσουμε τις διαθέσιμες μεθόδους στην κατηγορία Εξαίρεσης και στην κατηγορία SQLException.
Παράδειγμα εξαίρεσης SQL
Το σφάλμα σύνταξης στη δήλωση SQL ενδέχεται να οδηγήσει σε εξαίρεση SQL. Όταν συμβεί μια τέτοια εξαίρεση, ένα αντικείμενο της κλάσης SQLException θα μεταφερθεί στο μπλοκ catch. Χρησιμοποιώντας τις πληροφορίες στο αντικείμενο SQLException, μπορούμε να πιάσουμε αυτήν την εξαίρεση και να συνεχίσουμε το πρόγραμμα.
Το αντικείμενο SQLException έχει τις ακόλουθες μεθόδους:
Όνομα μεθόδου | Περιγραφή |
---|---|
getErrorCode () | Επιστρέφει τον αριθμό σφάλματος |
getMessage () | Επιστρέφει το μήνυμα σφάλματος |
getSQLState () | Επιστρέφει το SQLState του αντικειμένου SQLException. Μπορεί επίσης να επιστρέψει μηδενικό. Για σφάλμα βάσης δεδομένων, θα επιστρέψει την κατάσταση XOPEN SQL |
getNextException () | Επιστρέφει την επόμενη εξαίρεση στην αλυσίδα εξαιρέσεων. |
printStackTrace () | Εκτυπώνει την τρέχουσα εξαίρεση και το backtrace σε μια τυπική ροή σφαλμάτων |
setNextException (SQLEXception ex) | Χρησιμοποιείται για την προσθήκη μιας άλλης εξαίρεσης SQL στην αλυσίδα |
Πώς να χειριστείτε τις εξαιρέσεις
Η εξαίρεση που σχετίζεται με το JDBC ρίχνει ως επί το πλείστον το SQLException και είναι μια ελεγχόμενη εξαίρεση, οπότε πρέπει είτε να το πιάσουμε είτε να το ρίξουμε. Όλη η επιχειρηματική λογική και τα δεδομένα δέσμευσης θα πρέπει να γίνουν σε ένα μπλοκ δοκιμής, εάν συμβεί οποιαδήποτε εξαίρεση στο μπλοκ θα πρέπει να το πιάσουμε και να το χειριστούμε στο μπλοκ Catch Με βάση τον τύπο εξαίρεσης, πρέπει να κάνουμε τις επαναφορές ή να κάνουμε δεσμεύσεις στο μπλοκ Catch.
Κατηγορίες του SQLException
Μερικές φορές το πρόγραμμα οδήγησης JDBC ενδέχεται να ρίξει την υποκατηγορία του SQLException που αντιπροσωπεύει μια κοινή κατάσταση SQL ή μια κοινή κατάσταση σφάλματος που δεν σχετίζεται ειδικά με μια συγκεκριμένη τιμή κλάσης κατάστασης SQL. Θα σας κάνει να χειριστείτε την εξαίρεση με πιο συγκεκριμένο τρόπο και μπορούμε να την χειριστούμε στον κώδικά μας. Αυτοί οι τύποι εξαιρέσεων εμπίπτουν στις υποκατηγορίες μίας από τις ακόλουθες εξαιρέσεις:
- SQLNonTransientException: Αυτός ο τύπος εξαίρεσης θα δημιουργηθεί όταν μια περίπτωση όπου μια επανάληψη της ίδιας λειτουργίας θα αποτύχει, εκτός εάν έχει διορθωθεί η αιτία του SQLException.
- SQLTransientException: Αυτός ο τύπος εξαίρεσης θα απορριφθεί όταν μια προηγούμενη αποτυχημένη λειτουργία μπορεί να επιτύχει όταν δοκιμάσαμε ξανά τη λειτουργία χωρίς καμία αλλαγή / παρέμβαση.
- SQLRecoverableException: Αυτός ο τύπος εξαίρεσης θα απορριφθεί όταν μια προηγούμενη αποτυχημένη λειτουργία μπορεί να επιτύχει όταν δοκιμάσαμε ξανά τη λειτουργία με οποιαδήποτε αλλαγή / παρέμβαση από την εφαρμογή. Ενώ το κάνετε αυτό, η τρέχουσα σύνδεση θα πρέπει να κλείσει και να ανοίξει η νέα σύνδεση.
Άλλες υποκατηγορίες του SQLException:
Το παρακάτω είναι οι υποκατηγορίες του SQLException:
- BatchUpdateException: Αυτός ο τύπος εξαίρεσης θα απορριφθεί εάν έχει προκύψει κάποιο σφάλμα κατά τη λειτουργία της ενημέρωσης παρτίδας. Εκτός από τις πληροφορίες SQLException, το BatchUpdateException παρέχει την κατάσταση των δηλώσεων που έχουν εκτελεστεί / ενημερωθεί πριν από το σφάλμα.
- SQLClientInfoException: Αυτός ο τύπος εξαίρεσης θα απορριφθεί εάν δεν ήταν δυνατή η ρύθμιση μίας ή περισσότερων ιδιοτήτων πληροφοριών σε μια σύνδεση. Εκτός από τις πληροφορίες SQLException, το SQLClientInfoException μια λίστα ιδιοτήτων πληροφοριών πελάτη που δεν είχαν οριστεί.
Σε αυτό το σεμινάριο, θα δούμε το κανονικό SQLException και, στη συνέχεια, θα δούμε το BatchUpdateException. Μπορείτε να ασκήσετε τις υπόλοιπες υποκατηγορίες του SQLException στο σύστημά σας.
Στο ακόλουθο παράδειγμα, θα εξηγήσουμε πώς να χειριστούμε την εξαίρεση.
Όλα τα προγράμματα είναι γραμμένα σε Java, σε αυτό το σεμινάριο. Έχουμε χρησιμοποιήσει την έκδοση Java 8 και το Oracle DB.
>> Κάντε κλικ εδώ για λήψη του λογισμικού Oracle
>> Κάντε κλικ εδώ για λήψη της έκδοσης Java 8
Έχει τη διαδικασία εγκατάστασης Java βήμα προς βήμα.
Παράδειγμα προγράμματος εξαιρέσεων
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Exception_Example { public static void main(String() args) throws ClassNotFoundException { // TODO Auto-generated method stub String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011'; //Update query to set the email id for the employee whose empNUM is 10011 Class.forName('oracle.jdbc.driver.OracleDriver'); try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; statemnt1 = conn.createStatement(); System.out.println('Executing Update query using executeUpdate method'); int return_rows = statemnt1.executeUpdate(update_query); System.out.println('No. of Affected Rows = '+ return_rows); } catch(SQLException sqe) { System.out.println('Error Code = ' + sqe.getErrorCode()); System.out.println('SQL state = ' + sqe.getSQLState()); System.out.println('Message = ' + sqe.getMessage()); System.out.println('printTrace /n'); sqe.printStackTrace(); } } }
Παραγωγή:
Εξήγηση:
# 1) Δημιουργήθηκε ένα επιλεγμένο ερώτημα που έχει το όνομα της στήλης που δεν βρίσκεται στον πίνακα EMPLOYEE_DETAILS.
Δημιουργία ερωτήματος:
String update_query = 'update employee_details set email='martinL@gmail.com' where empNum1 = 10011';
#δύο) Δημιουργήθηκε σύνδεση, δήλωση και εκτελέστηκε το επιλεγμένο ερώτημα στο μπλοκ δοκιμής.
# 3) Στο μπλοκ Catch, χειριστήκαμε την εξαίρεση.
# 4) Εμφανίζουμε το Σφάλμα της εξαίρεσης χρησιμοποιώντας τη μέθοδο getError (), το SQLState της εξαίρεσης χρησιμοποιώντας τη μέθοδο getSQLState (), το μήνυμα της εξαίρεσης χρησιμοποιώντας τη μέθοδο getMessage () και εκτυπώνουμε το ίχνος στοίβας της εξαίρεσης χρησιμοποιώντας τη μέθοδο printStackTrace.
Παράδειγμα BatchUpdateException
Έχουμε δημιουργήσει έναν νέο πίνακα για να δείξουμε το παράδειγμα BatchUpdateException. Το όνομα του πίνακα είναι EMPLOYEE. Έχει 3 στήλες.
Αυτοί είναι:
- Αναγνωριστικό που είναι το πρωτεύον κλειδί
- ΕΠΙΘΕΤΟ
- ΟΝΟΜΑ
Σύνταξη για δημιουργία πίνακα στο ORACLE DB:
CREATE TABLE EMPLOYEE ( ID int NOT NULL PRIMARY KEY, LastName varchar(255), FirstName varchar(255) );
Πρόγραμμα Java:
package com.STH.JDBC; import java.sql.BatchUpdateException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Statement_ExecuteBatch_Example { public static void main(String() args) throws ClassNotFoundException, SQLException { //Inserting the following 3 rows in EMPLOYEE_DETAILS Table String insert_query1 = 'insert into employee values(101,'Patterson','Tony')'; String insert_query2 = 'insert into employee values(102,'Potter','Harry')'; String insert_query3 = 'insert into employee values(102,'Wong','Jane')'; Class.forName('oracle.jdbc.driver.OracleDriver'); //Opening Oracle DB Connection try(Connection conn = DriverManager.getConnection('jdbc:oracle:thin:system/pass123@localhost:1521:XE')) { Statement statemnt1 = conn.createStatement(); //Adding the 3 insert queries into the Statement object using addBatch method statemnt1.addBatch(insert_query1); statemnt1.addBatch(insert_query2); statemnt1.addBatch(insert_query3); int No_of_Afffected_Rows()= statemnt1.executeBatch(); //After inserting the data System.out.println('No of rows affected = ' +No_of_Afffected_Rows.length); } //Catching the BatchUpdateException catch(BatchUpdateException be) { //getting the updated rows status before the exception has occurred int() updateCount = be.getUpdateCounts(); int count = 1; for (int i : updateCount) { //Using for loop, printing the statement which has been successfully executed if (i == Statement.EXECUTE_FAILED) { System.out.println('Error on Statement ' + count +': Execution failed'); } else { System.out.println('Statement ' + count +': is executed'); } count++; //Incrementing the count to display the next updated row no. } //System.out.println('Error on statemet '+be.getUpdateCounts()); be.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }
ΠΑΡΑΓΩΓΗ:
Εξήγηση:
Αυτό που κάναμε στο παραπάνω πρόγραμμα είναι ότι έχουμε δημιουργήσει 3 ερωτήματα INSERT και το προσθέσαμε σε παρτίδα και το εκτελέσαμε. Το 3rdΤο ερώτημα έχει την ίδια τιμή αναγνωριστικού 1αγερώτημα δεδομένου ότι η στήλη ID είναι το πρωτεύον κλειδί του πίνακα EMPLOYEE, το πρόγραμμα έχει ρίξει ένα BatchUpdateException.
- Δημιούργησε τα 3 ερωτήματα εισαγωγής για να το εισαγάγει στον πίνακα ΕΡΓΑΖΟΜΕΝΟΣ. Το πρώτο και το τρίτο ερώτημα έχουν την ίδια τιμή ταυτότητας. Η στήλη id είναι το πρωτεύον κλειδί του πίνακα EMPLOYEE.
- Δημιούργησε αντικείμενο δήλωσης και πρόσθεσε αυτά τα 3 ερωτήματα σε αυτό χρησιμοποιώντας τη μέθοδο addBatch (). Στη συνέχεια ονομάζεται μέθοδος executeBatch () για την εκτέλεση.
- Δεδομένου ότι το πρώτο και τρίτο ερώτημα έχει την ίδια τιμή ταυτότητας. Όταν το executeBatch () προσπάθησε να εκτελέσει το τρίτο ερώτημα θα ρίξει το BatchUpdateException.
- Στο μπλοκ BatchUpdateException catch, καλέσαμε τη μέθοδο getUpdateCounts () για να λάβουμε την κατάσταση της ενημερωμένης σειράς.
- Χρησιμοποιώντας για βρόχο, ελέγχουμε ένα προς ένα εάν η κατάσταση της συγκεκριμένης δήλωσης που εκτελέστηκε απέτυχε ή όχι. Εάν η συγκεκριμένη δήλωση δεν αποτύχει, τότε θα εκτυπωθεί ο αριθμός σειράς της δήλωσης.
- Μετά από αυτό, θα εκτυπώσει το printStackTrace του BatchUpdateException.
- Στο παραπάνω παράδειγμα, δεδομένου ότι η εξαίρεση προέκυψε λόγω της τρίτης δήλωσης, επομένως έχουν εκτυπωθεί οι δηλώσεις 1 και 2. Στη συνέχεια, το πλήρες ίχνος της εξαίρεσης έχει εκτυπωθεί στην κονσόλα εξόδου.
Σημεία που πρέπει να θυμάστε:
- Η εξαίρεση που προέκυψε λόγω της βάσης δεδομένων θα εμπίπτει στο SQLException.
- Οι εξαιρέσεις στην Java μπορούν να αντιμετωπιστούν χρησιμοποιώντας το try: catch block.
- Το SQLException είναι η επιλεγμένη εξαίρεση, ώστε να μπορούμε να το χειριστούμε χρησιμοποιώντας το try: catch block.
- Έχουμε μερικές υποκατηγορίες του SQLException. Είναι SQLNonTransientException, SQLTransientException, SQLRecoverableException, BatchUpdateException και SQLClientInfoException.
Συχνές Ερωτήσεις
Q # 1) Τι είναι μια εξαίρεση SQL;
Απάντηση: Προέκυψε εξαίρεση λόγω της βάσης δεδομένων που είναι γνωστή ως εξαίρεση SQL. Μια εξαίρεση που παρέχει πληροφορίες σχετικά με τη βάση δεδομένων είναι επίσης γνωστή ως SQL Exception. Έχουμε μια τάξη SQLException στην Java, η οποία χρησιμοποιείται για την παροχή πληροφοριών σχετικά με την εξαίρεση. Έχει τις ακόλουθες μεθόδους:
- getErrorCode ()
- getMessage ()
- getSQLState ()
- printStackTrace ()
- getNextException ()
Q # 2) Πώς να χειριστείτε την εξαίρεση στο SQL;
Απάντηση: Γράψτε τη λογική της επιχείρησης στο μπλοκ δοκιμής. Εάν έχει προκύψει κάποιο λάθος ή εξαίρεση, πιάστε το στο μπλοκ Catch και γράψτε το κατάλληλο μήνυμα για να βρείτε εύκολα την εξαίρεση.
Try – Catch block χρησιμοποιείται για τον χειρισμό της εξαίρεσης.
Q # 3) Πότε μπορεί να εμφανιστεί το SQLException στην Java;
Απάντηση: Το SQLException παρουσιάζεται εάν υπάρχει σφάλμα στην πρόσβαση στη βάση δεδομένων ή άλλα σφάλματα που σχετίζονται με τη βάση δεδομένων. Όταν εμφανιστεί το SQLException, ένα αντικείμενο τύπου SQLException θα μεταφερθεί στον όρο σύλληψης. Μπορούμε να το χειριστούμε στο μπλοκ Catch.
Q # 4) Ποια είναι η αλυσίδα εξαίρεσης στην Java και ποια είναι η χρήση της;
Απάντηση: Μία εξαίρεση που προκαλεί μια άλλη εξαίρεση είναι γνωστή ως Εξαίρεση Αλυσίδα ή Αλυσοδεμένη Εξαίρεση. Στις περισσότερες περιπτώσεις πρέπει να αλυσολογήσουμε την εξαίρεση έτσι ώστε να σχετίζεται με μια εξαίρεση με άλλη εξαίρεση, θα κάνει τα αρχεία καταγραφής σαφή και εύκολη παρακολούθηση. Θα είναι χρήσιμο για τον προγραμματιστή στη διαδικασία εντοπισμού σφαλμάτων.
Για παράδειγμα:
Εξετάστε μια μέθοδο που ρίχνει μια αριθμητική εξαίρεση λόγω διαίρεσης με μηδέν. Η πραγματική αιτία της εξαίρεσης είναι ένα σφάλμα I / O, το οποίο καθιστά τον διαιρέτη μηδέν. Η μέθοδος θα ρίξει μόνο μια αριθμητική εξαίρεση στον προγραμματιστή. Για να μην γνωρίζει ο καλούντος / προγραμματιστής για την πραγματική αιτία της Εξαίρεσης. Σε αυτόν τον τύπο κατάστασης, μπορούμε να χρησιμοποιήσουμε μια αλυσοδεμένη εξαίρεση.
συμπέρασμα
Οι εξαιρέσεις μπορούν να αντιμετωπιστούν χρησιμοποιώντας ένα μπλοκ δοκιμής ή ρίχνοντάς το. Οι εξαιρέσεις που προέκυψαν λόγω της βάσης δεδομένων είναι γνωστή ως SQLException. Έχουμε μια ξεχωριστή τάξη για το SQLException που είναι μια υποκατηγορία της Εξαίρεσης. Έχουμε τις μεθόδους για να γνωρίσουμε πιο συγκεκριμένα την εξαίρεση SQL.
Οι μέθοδοι είναι getMessage (), getErrorCode (), getSQLState (), getNextException και printStackTace. Το getNextException θα χρησιμοποιηθεί στην υπόθεση Exception Chained.
Συνιστώμενη ανάγνωση
- Java Εξαιρέσεις και Χειρισμός Εξαιρέσεων με Παραδείγματα
- Κορυφαίες 10 εξαιρέσεις σεληνίου και πώς να τις χειριστείτε (Ακριβής κωδικός)
- Πλήρης οδηγός για την εξαίρεση PL SQL με παραδείγματα
- C # Εκμάθηση χειρισμού εξαιρέσεων με παραδείγματα κώδικα
- Εξαίρεση χειρισμός σε C ++
- Πώς να χειριστείτε την εξαίρεση σε δέσμες ενεργειών SoapUI Groovy - SoapUI Tutorial # 11
- Εκμάθηση PL SQL για αρχάριους με παραδείγματα | Τι είναι το PL / SQL
- Πακέτο PL SQL: Οδηγός πακέτου Oracle PL / SQL με παραδείγματα