Τα Exceptions στη γλώσσα C# αναφέρονται σε μηχανισμούς που χρησιμοποιούνται για την αντιμετώπιση και διαχείριση σφαλμάτων κατά την εκτέλεση ενός προγράμματος. Τα Exceptions παρουσιάζουν καταστάσεις εξαίρεσης, δηλαδή αναμενόμενες ή απροσδόκητες καταστάσεις που επηρεάζουν την ορθή εκτέλεση ενός προγράμματος.
Όταν παρουσιάζεται ένα Exception, η ροή του προγράμματος διακόπτεται και εκκινείται η αναζήτηση για ένα μπλοκ κώδικα που μπορεί να χειριστεί το συγκεκριμένο Exception. Αν δεν βρεθεί κατάλληλος χειρισμός, το πρόγραμμα διακόπτεται και εμφανίζεται ένα μήνυμα σφάλματος (error message) που περιέχει πληροφορίες για το συγκεκριμένο Exception που προκλήθηκε.
Οι Exceptions στην C# διαχειρίζονται με τη χρήση των δομών try-catch-finally. Ο κώδικας που ενδέχεται να προκαλέσει Exception τοποθετείται εντός της δομής try. Στη συνέχεια, μπορούμε να ορίσουμε μία ή περισσότερες δομές catch για να πιάσουμε και να χειριστούμε συγκεκριμένα Exceptions. Τέλος, μπορούμε να χρησιμοποιήσουμε τη δομή finally για να καθορίσουμε κώδικα που θα εκτελεστεί πάντα, ανεξάρτητα από το αν προκλήθηκε Exception ή όχι.
Οι Exceptions στην C# μπορούν να είναι προκαθορισμένα (built-in) ή προσαρμοσμένα (custom). Οι προκαθορισμένες Exceptions παρέχονται από τη γλώσσα και τη βιβλιοθήκη κλάσεων της C#, ενώ οι προσαρμοσμένες Exceptions μπορούν να δημιουργηθούν από τον προγραμματιστή για ειδικές ανάγκες και περιπτώσεις. Οι προκαθορισμένες Exceptions περιλαμβάνουν, μεταξύ άλλων, τις ArgumentException, ArgumentNullException, IOException και DivideByZeroException.
Η χρήση των Exceptions στην C# επιτρέπει την ανίχνευση, αναφορά και διαχείριση σφαλμάτων, καθιστώντας τον κώδικα πιο αξιόπιστο, ασφαλή και εύκολο στη συντήρηση. Ο προγραμματιστής μπορεί να προσδιορίσει τον τρόπο αντιμετώπισης και ανακτήσης από τα Exceptions, επιτρέποντάς του να προσφέρει κατάλληλες λύσεις για την αποκατάσταση και συνέχιση της εκτέλεσης του προγράμματος.
Εδώ είναι ένα παράδειγμα που δείχνει τη χρήση της δομής try..catch:
try { // Κώδικας που μπορεί να προκαλέσει εξαίρεση } catch (Exception ex) { // Κώδικας που εκτελείται όταν προκύψει εξαίρεση }
Στο μπλοκ try τοποθετείτε τον κώδικά σας που μπορεί να προκαλέσει μια εξαίρεση. Εάν προκύψει μια εξαίρεση κατά την εκτέλεση αυτού του κώδικα, ο έλεγχος θα μεταβεί στο μπλοκ catch.
Στο μπλοκ catch καθορίζετε τον κώδικα που θα εκτελείται όταν προκύψει μια εξαίρεση. Η μεταβλητή ex αναφέρεται στην εξαίρεση που προκλήθηκε και σας επιτρέπει να αποκτήσετε πρόσβαση σε πληροφορίες σχετικά με την εξαίρεση (όπως το μήνυμα σφάλματος).
Χρησιμοποιώντας τη δομή try..catch, μπορείτε να αντιδράτε στις εξαιρέσεις και να εκτελέσετε κατάλληλο κώδικα για να διαχειριστείτε την κατάσταση σφάλματος και να παράσχετε πληροφορίες στον χρήστη ή να προβείτε σε διορθώσεις κατάλληλες για την εξαίρεση.
Ας αναλύσουμε το παρακάτω παράδειγμα, όπου δημιουργούμε έναν πίνακα με τρία ακέραια αριθμητικά στοιχεία:
using System; try { int[] numbers = new int[3] { 1, 2, 3 }; // Προσπαθούμε να αποκτήσουμε πρόσβαση σε ένα στοιχείο εκτός των ορίων του πίνακα int fourthNumber = numbers[3]; } catch (Exception ex) { Console.WriteLine("An exception occurred: " + ex.Message); }
Σε αυτό το παράδειγμα, δημιουργούμε έναν πίνακα numbers
με τρία ακέραια αριθμητικά στοιχεία. Στη συνέχεια, προσπαθούμε να αποκτήσουμε πρόσβαση σε ένα στοιχείο εκτός των ορίων του πίνακα, προσπαθώντας να αποκτήσουμε πρόσβαση στο τέταρτο στοιχείο (δεύτερος δείκτης 3
).
Επειδή αυτή η ενέργεια είναι εκτός των ορίων του πίνακα, θα προκληθεί μια εξαίρεση IndexOutOfRangeException
. Στο μπλοκ catch
, το πρόγραμμα θα εκτελέσει τον κώδικα που βρίσκεται μέσα σε αυτό το μπλοκ, εκτυπώνοντας ένα μήνυμα λάθους που περιλαμβάνει το μήνυμα της εξαίρεσης ex.Message
.
[adinserter block=”2″]
Η χρήση της δομής try..catch επιτρέπει στο πρόγραμμά σας να αντιδράσει σε ανεπιθύμητες καταστάσεις, όπως τις εξαιρέσεις, και να εκτελέσει κατάλληλο κώδικα για να διαχειριστεί την κατάσταση σφάλματος χωρίς να διακόπτει την εκτέλεση του προγράμματος.
Μπορείτε επίσης να εμφανίσετε το δικό σας μήνυμα λάθους:
using System; try { int[] numbers = new int[3] { 1, 2, 3 }; // Προσπάθεια πρόσβασης σε ένα στοιχείο εκτός των ορίων του πίνακα int fourthNumber = numbers[3]; } catch (Exception ex) { Console.WriteLine("Προέκυψε ένα σφάλμα: " + ex.Message); Console.WriteLine("Παρακαλώ επικοινωνήστε με τον διαχειριστή του συστήματος."); }
Σε αυτό το παράδειγμα, μετά την εκτύπωση του μηνύματος σφάλματος που περιέχεται στο ex.Message
, προσθέσαμε μια επιπλέον γραμμή για να εμφανίσουμε ένα προσαρμοσμένο μήνυμα λάθους. Αυτό το μήνυμα μπορεί να περιέχει πληροφορίες ή οδηγίες για τον χρήστη, ή μπορεί να προτείνει να επικοινωνήσει με τον διαχειριστή του συστήματος για βοήθεια.
Με την προσθήκη προσαρμοσμένων μηνυμάτων λάθους, μπορείτε να παρέχετε περισσότερες πληροφορίες στον χρήστη σχετικά με την κατάσταση σφάλματος και να τον κατευθύνετε για περαιτέρω διορθώσεις ή υποστήριξη.
Η δήλωση finally σας επιτρέπει να εκτελέσετε κώδικα μετά των μπλοκ try…catch, ανεξάρτητα από το αποτέλεσμα:
try { // Κώδικας που μπορεί να προκαλέσει εξαίρεση } catch (Exception ex) { // Κώδικας που εκτελείται όταν προκύψει εξαίρεση } finally { // Κώδικας που εκτελείται πάντα, ανεξάρτητα από το αποτέλεσμα }
Ο κώδικας που τοποθετείτε μέσα στο μπλοκ finally θα εκτελείται πάντα, ανεξάρτητα από το αποτέλεσμα του μπλοκ try ή catch. Αυτό είναι χρήσιμο όταν έχετε κώδικα που πρέπει να εκτελεστεί ανεξάρτητα από το εάν προκληθεί μια εξαίρεση ή όχι, όπως τον καθαρισμό πόρων ή την αποδέσμευση μνήμης.
Μπορείτε να έχετε μόνο ένα μπλοκ finally μέσα σε ένα μπλοκ try…catch. Ο κώδικας μέσα στο finally θα εκτελεστεί ακόμη και αν υπάρξει μια εξαίρεση και ο κώδικας στο catch δεν εκτελεστεί.,
Η δήλωση throw σας επιτρέπει να δημιουργήσετε ένα προσαρμοσμένο σφάλμα.
Η δήλωση throw χρησιμοποιείται μαζί με μια κλάση εξαίρεσης. Υπάρχουν πολλές κλάσεις εξαίρεσης διαθέσιμες στο C#: ArithmeticException, FileNotFoundException, IndexOutOfRangeException, TimeOutException, κλπ.
Για παράδειγμα:
try { int age = -1; if (age < 0) { throw new ArgumentOutOfRangeException("age", "Age cannot be negative."); } } catch (ArgumentOutOfRangeException ex) { Console.WriteLine("An argument out of range exception occurred: " + ex.Message); }
Σε αυτό το παράδειγμα, ελέγχουμε την τιμή της μεταβλητής age και εάν είναι αρνητική, προκαλούμε μια εξαίρεση ArgumentOutOfRangeException
. Χρησιμοποιούμε τη δήλωση throw για να προκαλέσουμε την εξαίρεση και δημιουργούμε μια νέα έκδοση της κλάσης ArgumentOutOfRangeException
με το όνομα της παραμέτρου και ένα προσαρμοσμένο μήνυμα λάθους.
Στο μπλοκ catch, μπορούμε να αντιμετωπίσουμε την εξαίρεση ArgumentOutOfRangeException
και να εκτυπώσουμε το προσαρμοσμένο μήνυμα λάθους που περιλαμβάνεται στο ex.Message
.
Με την δήλωση throw, μπορείτε να δημιουργήσετε τις δικές σας προσαρμοσμένες εξαιρέσεις και να ρυθμίσετε το αντίστοιχο μήνυμα λάθους που θα εμφανίζεται κατά την εκτέλεση του προγράμματος.