Εδώ είναι ένα ενδιαφέρον γεγονός: Όχι κώδικας είναι χωρίς λάθη - στην πραγματικότητα, κάποιος κώδικας είναι γεμάτος από "λάθη" σκόπιμα.
Τι είναι ένα σφάλμα σε μια εφαρμογή; Ένα σφάλμα είναι μια λάθος κωδικοποιημένη λύση σε ένα πρόβλημα. Αυτά είναι λάθη λογικής που θα μπορούσε να οδηγήσει σε λανθασμένα αποτελέσματα λειτουργίας όπου όλα φαίνονται ωραία μαζί, αλλά το αποτέλεσμα της εφαρμογής είναι εντελώς άχρηστο. Με σφάλματα λογικής, ένα εφαρμογή μπορεί να μην σταματήσει να λειτουργεί.
Οι εξαιρέσεις μπορεί να περιλαμβάνουν σφάλματα στον κώδικά σας όπου προσπαθείτε να διαιρέσετε αριθμούς με μηδέν ή προσπαθείτε να χρησιμοποιήσετε απελευθερωμένα μπλοκ μνήμης ή προσπαθήστε να παρέχετε λανθασμένες παραμέτρους σε μια συνάρτηση. Ωστόσο, μια εξαίρεση σε μια εφαρμογή δεν είναι πάντα σφάλμα.
Εξαιρέσεις και τάξη εξαίρεσης
Εξαιρέσεις είναι ειδικοί όροι που απαιτούν ειδικό χειρισμό. Όταν προκύπτει μια κατάσταση τύπου σφάλματος, το πρόγραμμα δημιουργεί μια εξαίρεση.
Εσείς (ως συγγραφέας εφαρμογών) θα χειριστείτε εξαιρέσεις για να κάνετε την εφαρμογή σας πιο επιρρεπής σε σφάλματα και να ανταποκριθείτε στην εξαιρετική κατάσταση.
Στις περισσότερες περιπτώσεις, θα βρείτε τον εαυτό σας ως συγγραφέας εφαρμογών και επίσης συγγραφέας της βιβλιοθήκης. Επομένως, θα πρέπει να γνωρίζετε πώς να αυξήσετε τις εξαιρέσεις (από τη βιβλιοθήκη σας) και πώς να τις χειριστείτε (από την αίτησή σας).
Το άρθρο στις χειρισμός σφαλμάτων και εξαιρέσεων παρέχει μερικές βασικές οδηγίες για το πώς να προφυλάξετε τα σφάλματα χρησιμοποιώντας το μπλοκ try / kecuali / end και try / τελικά / end προστατευμένα για να ανταποκριθείτε ή να χειριστείτε εξαιρετικές συνθήκες.
Μια απλή δοκιμή / εκτός από τα μπλοκ προστασίας μοιάζει με:
προσπαθήστε
ThisFunctionMightRaiseAnException ();
εκτός// χειριστείτε τυχόν εξαιρέσεις που έχουν εγγραφεί στο ThisFunctionMightRaiseAnException () εδώ
τέλος;
Το ThisFunctionMightRaiseAnException ενδέχεται να έχει, κατά την εφαρμογή του, μια γραμμή κώδικα όπως
υψώνω Εξαίρεση. Δημιουργία ('ειδική κατάσταση!');
Η εξαίρεση είναι μια ειδική τάξη (μία από τις λίγες χωρίς T μπροστά από το όνομα) που ορίζεται στην ενότητα sysutils.pas. Η μονάδα SysUtils ορίζει αρκετούς ειδικούς σκοπούς Εξαίρεση απογόνων (και δημιουργεί έτσι μια ιεραρχία τάξεων εξαίρεσης) όπως ERangeError, EDivByZero, EIntOverflow κ.λπ.
Στις περισσότερες περιπτώσεις, οι εξαιρέσεις που θα χειρίζατε στο προστατευμένο μπλοκ δοκιμής / εκτός δεν θα ήταν της Εξαίρεσης (base) class αλλά από κάποια ειδική κλάση εξαγωγής Exception που ορίζεται είτε στο VCL είτε στη βιβλιοθήκη που είστε χρησιμοποιώντας.
Χειρισμός εξαιρέσεων με χρήση του Try / Except
Για να πιάσετε και να χειριστείτε έναν τύπο εξαίρεσης θα δημιουργήσετε ένα πρόγραμμα χειρισμού εξαιρέσεων "on type_of_exception do". Το "κατ 'εξαίρεση" μοιάζει σχεδόν με την κλασική δήλωση περίπτωσης:
προσπαθήστε
ThisFunctionMightRaiseAnException;
εκτός EZeroDivide ντουμπέιν// κάτι όταν διαιρείται με μηδέντέλος;
επί EIntOverflow ντουμπέιν// κάτι όταν είναι πολύ μεγάλος ακέραιος υπολογισμόςτέλος;
elsebegin// κάτι όταν εμφανίζονται άλλοι τύποι εξαιρέσεωντέλος;
τέλος;
Σημειώστε ότι το άλλο μέρος θα έπαιρνε όλες (άλλες) εξαιρέσεις, συμπεριλαμβανομένων εκείνων για τις οποίες δεν γνωρίζετε τίποτα. Σε γενικές γραμμές, ο κώδικάς σας θα πρέπει να χειρίζεται μόνο εξαιρέσεις που γνωρίζετε πραγματικά πώς να χειριστείτε και περιμένετε να πετάξετε.
Επίσης, δεν πρέπει ποτέ να "τρώτε" μια εξαίρεση:
προσπαθήστε
ThisFunctionMightRaiseAnException;
εκτός
τέλος;
Η κατανάλωση της εξαίρεσης σημαίνει ότι δεν ξέρετε πώς να χειριστείτε την εξαίρεση ή δεν θέλετε οι χρήστες να δουν την εξαίρεση ή οτιδήποτε άλλο.
Όταν χειρίζεστε την εξαίρεση και χρειάζεστε περισσότερα δεδομένα από αυτήν (μετά από όλα είναι μια παρουσία μιας κλάσης) μάλλον μόνο τον τύπο της εξαίρεσης που μπορείτε να κάνετε:
προσπαθήστε
ThisFunctionMightRaiseAnException;
εκτός Ε: Εξαίρεση ντουμπέιν
ShowMessage (E.Message);
τέλος;
τέλος;
Το "E" στο "E: Exception" είναι μια προσωρινή μεταβλητή εξαίρεσης του τύπου που καθορίζεται μετά τον χαρακτήρα της στήλης (στο παραπάνω παράδειγμα η βασική κατηγορία Exception). Χρησιμοποιώντας το E μπορείτε να διαβάσετε (ή να γράψετε) τιμές στο αντικείμενο εξαίρεσης, όπως λήψη ή ρύθμιση της ιδιότητας Μηνύματος.
Ποιος ελευθερώνει την εξαίρεση;
Έχετε παρατηρήσει πώς οι εξαιρέσεις είναι στην πραγματικότητα περιπτώσεις μιας τάξης που κατεβαίνει από την Εξαίρεση; Η λέξη-κλειδί αύξησης ρίχνει μια παρουσία κλάσης εξαίρεσης. Αυτό που δημιουργείτε (η περίπτωση εξαίρεσης είναι ένα αντικείμενο), εσείς επίσης πρέπει να ελευθερώσετε. Εάν (ως συγγραφέας βιβλιοθήκης) δημιουργήσετε μια παρουσία, θα τον απελευθερώσει ο χρήστης της εφαρμογής;
Εδώ είναι το Δελφοί magic: Ο χειρισμός μιας εξαίρεσης καταστρέφει αυτόματα το αντικείμενο εξαίρεσης. Αυτό σημαίνει ότι όταν γράφετε τον κωδικό στο μπλοκ "kecuali / τέλος", θα απελευθερώσει τη μνήμη εξαίρεσης.
Τι συμβαίνει λοιπόν εάν το ThisFunctionMightRaiseAnException εγείρει πραγματικά μια εξαίρεση και δεν το χειρίζεστε (αυτό δεν είναι το ίδιο με το "φαγητό");
Τι γίνεται με τον χειρισμό του αριθμού / 0;
Όταν ρίχνετε μια εξαίρεση χωρίς χειρισμό στον κώδικά σας, οι Δελφοί χειρίζονται και πάλι μαγικά την εξαίρεσή σας εμφανίζοντας το παράθυρο διαλόγου σφάλματος στον χρήστη. Στις περισσότερες περιπτώσεις, αυτός ο διάλογος δεν παρέχει αρκετά δεδομένα για τον χρήστη (και τελικά εσείς) για να κατανοήσετε την αιτία της εξαίρεσης.
Αυτό ελέγχεται από το βρόχο μηνυμάτων ανώτερου επιπέδου των Δελφών όπου όλα Οι εξαιρέσεις υποβάλλονται σε επεξεργασία από το καθολικό αντικείμενο εφαρμογής και τη μέθοδο HandleException.
Για να χειριστείτε εξαιρέσεις παγκοσμίως και να εμφανίσετε το δικό σας πιο φιλικό προς το χρήστη διάλογο, μπορείτε να γράψετε κώδικα για το TApplicationEvents. Διαχειριστής συμβάντων OnException.
Σημειώστε ότι το καθολικό αντικείμενο εφαρμογής ορίζεται στη μονάδα Φόρμες. Το TApplicationEvents είναι ένα στοιχείο που μπορείτε να χρησιμοποιήσετε για να παρακολουθήσετε τα συμβάντα του καθολικού αντικειμένου εφαρμογής.