PHP Δοκιμάστε το Catch Example: Exception & Error Handling Tutorial
Τι είναι η Εξαίρεση;
Ένα σφάλμα είναι ένα απροσδόκητο αποτέλεσμα προγράμματος που δεν μπορεί να χειριστεί το ίδιο το πρόγραμμα.
Τα σφάλματα επιλύονται με τη διόρθωση του προγράμματος. Ένα παράδειγμα σφάλματος θα ήταν ένας άπειρος βρόχος που δεν σταματά ποτέ να εκτελείται.
Μια εξαίρεση είναι το μη αναμενόμενο αποτέλεσμα προγράμματος που μπορεί να χειριστεί το ίδιο το πρόγραμμα.
Παραδείγματα εξαιρέσεων περιλαμβάνουν την προσπάθεια να ανοίξετε ένα αρχείο που δεν υπάρχει.
Αυτή η εξαίρεση μπορεί να αντιμετωπιστεί είτε δημιουργώντας το αρχείο είτε παρουσιάζοντας στον χρήστη την επιλογή αναζήτησης του αρχείου.
Γιατί να χειριστείτε την εξαίρεση;
- Αποφύγετε απροσδόκητα αποτελέσματα στις σελίδες μας που μπορεί να είναι πολύ ενοχλητικά ή ενοχλητικά για τους τελικούς χρήστες μας
- Βελτιώστε την ασφάλεια των εφαρμογών μας μη εκθέτοντας πληροφορίες που ενδέχεται να χρησιμοποιήσουν κακόβουλοι χρήστες για να επιτεθούν στις εφαρμογές μας
- Οι εξαιρέσεις Php χρησιμοποιούνται για την αλλαγή της κανονικής ροής ενός προγράμματος εάν παρουσιαστεί κάποιο προβλέψιμο σφάλμα.
Χειρισμός σφαλμάτων PHP
Όταν παρουσιαστεί σφάλμα, ανάλογα με τις ρυθμίσεις διαμόρφωσης, PHP εμφανίζει το μήνυμα σφάλματος στο πρόγραμμα περιήγησης Ιστού με πληροφορίες σχετικά με το σφάλμα που παρουσιάστηκε.
Η PHP προσφέρει διάφορους τρόπους χειρισμού σφαλμάτων.
Θα εξετάσουμε τρεις (3) κοινώς χρησιμοποιούμενες μεθόδους.
- Die δηλώσεις– η λειτουργία die συνδυάζει τη λειτουργία ηχούς και εξόδου σε μία. Είναι πολύ χρήσιμο όταν θέλουμε να βγάλουμε ένα μήνυμα και να σταματήσουμε την εκτέλεση του σεναρίου όταν παρουσιαστεί κάποιο σφάλμα.
- Προσαρμοσμένοι χειριστές σφαλμάτων – αυτές είναι συναρτήσεις που ορίζονται από το χρήστη και καλούνται κάθε φορά που παρουσιάζεται σφάλμα.
- Αναφορά σφαλμάτων PHP – το μήνυμα σφάλματος ανάλογα με τις ρυθμίσεις αναφοράς σφαλμάτων PHP. Αυτή η μέθοδος είναι πολύ χρήσιμη σε περιβάλλον ανάπτυξης όταν δεν έχετε ιδέα τι προκάλεσε το σφάλμα. Οι πληροφορίες που εμφανίζονται μπορούν να σας βοηθήσουν να εντοπίσετε σφάλματα στην εφαρμογή σας.
Παραδείγματα χειρισμού σφαλμάτων
Ας δούμε τώρα μερικά απλά παραδείγματα με ρουτίνες χειρισμού σφαλμάτων.
Ας υποθέσουμε ότι έχουμε αναπτύξει μια εφαρμογή που χρησιμοποιεί αρχεία κειμένου για την αποθήκευση δεδομένων. Ίσως θέλουμε να ελέγξουμε την ύπαρξη του αρχείου προτού επιχειρήσουμε να διαβάσουμε δεδομένα από αυτό.
Ο παρακάτω κώδικας υλοποιεί το παραπάνω παράδειγμα.
<?php $denominator = 0; echo 2 / $denominator; ?>
Αν υποθέσουμε ότι αποθηκεύσατε το αρχείο simple_error.php στον φάκελο phptuts, ανοίξτε τη διεύθυνση URL http://localhost/phptuts/simple_error.php
Θα λάβετε τα ακόλουθα αποτελέσματα
Όπως μπορείτε να δείτε από τα παραπάνω αποτελέσματα, κάνει την εφαρμογή μας να φαίνεται αντιεπαγγελματική και μπορεί να είναι ενοχλητική για τον χρήστη.
Θα τροποποιήσουμε τον παραπάνω κώδικα και θα γράψουμε ένα πρόγραμμα χειρισμού σφαλμάτων για την εφαρμογή
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Αν υποθέσουμε ότι αποθηκεύσατε τον παραπάνω κώδικα ως error_handling.php, ανοίξτε τη διεύθυνση URL http://localhost/phptuts/error_handling.php
Σημείωση: Είναι μια καλή πρακτική ασφαλείας να εμφανίζεται ένα μήνυμα όπως αυτό που φαίνεται παραπάνω αντί να εμφανίζεται το μήνυμα όπως "Το αρχείο δεν βρέθηκε".
Ας δούμε ένα άλλο παράδειγμα που χρησιμοποιεί έναν προσαρμοσμένο χειριστή σφαλμάτων.
Ο προσαρμοσμένος χειριστής σφαλμάτων θα οριστεί ως η προεπιλεγμένη λειτουργία χειρισμού σφαλμάτων PHP και βασικά θα εμφανίζει έναν αριθμό σφάλματος και ένα μήνυμα.
Ο παρακάτω κώδικας επεξηγεί την υλοποίηση του παραπάνω παραδείγματος
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Ανοίξτε τη διεύθυνση URL http://localhost/phptuts/custom_error_handler.php θα λάβετε τα ακόλουθα αποτελέσματα
Όπως μπορείτε να δείτε από το παραπάνω παράδειγμα, οι προσαρμοσμένοι χειριστές σφαλμάτων είναι ισχυροί με την έννοια ότι
- Μας επιτρέπουν να προσαρμόσουμε τα μηνύματα σφάλματος.
- Ο προσαρμοσμένος χειριστής σφαλμάτων μπορεί επίσης να περιλαμβάνει την καταγραφή σφαλμάτων σε ένα αρχείο/βάση δεδομένων, την αποστολή email στον προγραμματιστή κ.λπ.
Ας δούμε τώρα τον τρίτο τύπο χειρισμού σφαλμάτων. Θα χρησιμοποιήσουμε την ενσωματωμένη συνάρτηση PHP error_reporting. Έχει την εξής βασική σύνταξη
<?php error_reporting($reporting_level); ?>
ΕΔΩ,
- Το "error_reporting" είναι η συνάρτηση αναφοράς σφαλμάτων PHP
- Το "$reporting_level" είναι προαιρετικό, μπορεί να χρησιμοποιηθεί για να ορίσετε το επίπεδο αναφοράς. Εάν δεν έχει καθοριστεί επίπεδο αναφοράς, η PHP θα χρησιμοποιήσει το προεπιλεγμένο επίπεδο αναφοράς σφαλμάτων όπως καθορίζεται στο αρχείο php.ini.
Επίπεδο αναφοράς | Descriptιόν | Παράδειγμα |
---|---|---|
E_ΠΡΟΕΙΔΟΠΟΙΗΣΗ | Εμφανίζει μόνο προειδοποιητικά μηνύματα. Δεν σταματά την εκτέλεση του σεναρίου | error_reporting(E_WARNING); |
E_ΣΗΜΕΙΩΣΗ | Εμφανίζει ειδοποιήσεις που μπορεί να προκύψουν κατά την κανονική εκτέλεση ενός προγράμματος ή μπορεί να είναι σφάλμα. | error_reporting(E_ ΕΙΔΟΠΟΙΗΣΗ); |
E_USER_ERROR | Εμφανίζει σφάλματα που δημιουργούνται από τον χρήστη, π.χ. προσαρμοσμένο πρόγραμμα χειρισμού σφαλμάτων | error_reporting(E_ USER_ERROR); |
E_USER_WARNING | Εμφανίζει προειδοποιητικά μηνύματα που δημιουργούνται από τον χρήστη | error_reporting(E_USER_WARNING); |
E_USER_NOTICE | Εμφανίζει ειδοποιήσεις που δημιουργούνται από τους χρήστες | error_reporting(E_USER_NOTICE); |
E_ΑΝΑΚΤΗΣΗ_ΣΦΑΛΜΑ | Εμφανίζει σφάλματα που δεν είναι μοιραία και μπορούν να αντιμετωπιστούν χρησιμοποιώντας προσαρμοσμένους χειριστές σφαλμάτων | error_reporting(E_RECOVERABLE_ERROR); |
E_ALL | Εμφανίζει όλα τα σφάλματα και τις προειδοποιήσεις | error_reporting (E_ ALL); |
Διαφορά μεταξύ σφαλμάτων και εξαίρεσης
- Γίνονται εξαιρέσεις και προορίζονται να συλληφθούν, ενώ τα σφάλματα είναι γενικά μη ανακτήσιμα.
- Ο χειρισμός των εξαιρέσεων γίνεται με αντικειμενοστραφή τρόπο. Αυτό σημαίνει όταν γίνεται εξαίρεση. δημιουργείται ένα αντικείμενο εξαίρεσης που περιέχει τις λεπτομέρειες της εξαίρεσης.
Ο παρακάτω πίνακας δείχνει τις μεθόδους αντικειμένων εξαίρεσης
Μέθοδος | Descriptιόν | Παράδειγμα |
---|---|---|
getMessage() | Εμφανίζει το μήνυμα της εξαίρεσης |
<?php echo $e->getMessage(); ?> |
πάρετε τον κωδικό() | Εμφανίζει τον αριθμητικό κωδικό που αντιπροσωπεύει την εξαίρεση |
<?php echo $e->getCode(); ?> |
getFile() | Εμφανίζει το όνομα του αρχείου και τη διαδρομή όπου προέκυψε η εξαίρεση |
<?php echo $e->getFile(); ?> |
getLine() | Εμφανίζει τον αριθμό γραμμής όπου προέκυψε η εξαίρεση |
<?php echo $e->getLine(); ?> |
getTrace() | Εμφανίζει έναν πίνακα του backtrace πριν από την εξαίρεση |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Εμφανίζει την προηγούμενη εξαίρεση πριν από την τρέχουσα |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Εμφανίζει το backtrace της εξαίρεσης ως συμβολοσειρά αντί για πίνακα |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Εμφανίζει ολόκληρη την εξαίρεση ως συμβολοσειρά |
<?php echo $e->__toString(); ?> |
Παρακάτω είναι η βασική σύνταξη για την εξαίρεση.
<?php throw new Exception("This is an exception example"); ?>
ΕΔΩ,
- Το "ρίξιμο" είναι η λέξη-κλειδί που χρησιμοποιείται για την εξαίρεση
- Το "new Exception(…)" δημιουργεί ένα αντικείμενο εξαίρεσης και μεταβιβάζει ως παράμετρο μηνύματος τη συμβολοσειρά "This is a exception example".
Ο παραπάνω κώδικας βγάζει το ακόλουθο μήνυμα.
Θα εξετάσουμε τώρα ένα παράδειγμα που εφαρμόζει τις εξαιρέσεις ρίψεων και συλλήψεων.
Θα τροποποιήσουμε το παραπάνω παράδειγμα και θα συμπεριλάβουμε τη δοκιμή, τη ρίψη και τη σύλληψη.
Έχει την εξής βασική σύνταξη.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
ΕΔΩ,
- Το "try{…}" είναι το μπλοκ κώδικα που θα εκτελεστεί και θα μπορούσε ενδεχομένως να δημιουργήσει μια εξαίρεση
- Το "catch(Exception $e){…}" είναι το μπλοκ κώδικα που πιάνει την εξαίρεση και εκχωρεί το αντικείμενο εξαίρεσης στη μεταβλητή $e.
Ο παρακάτω κώδικας δείχνει το βασικό παράδειγμα εξαίρεσης με την εξαίρεση δοκιμής, ρίψης και σύλληψης που εφαρμόζεται.
Το πρόγραμμα ρίχνει σκόπιμα μια εξαίρεση την οποία στη συνέχεια πιάνει.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Ανοίξτε τη διεύθυνση URL http://localhost/phptuts/exception_handling.php Θα λάβετε τα ακόλουθα αποτελέσματα.
Είναι επίσης δυνατό να δημιουργηθούν πολλαπλές εξαιρέσεις για μία πρόταση δοκιμής php ανάλογα με τον τύπο της εξαίρεσης που ρίχνεται.
Δείτε το άρθρο για MySQL, πρόσβαση σε δεδομένα PHP… για παραδείγματα υλοποίησης πολλαπλών εξαιρέσεων
Πολλαπλές Εξαιρέσεις
Πολλαπλές εξαιρέσεις χρησιμοποιήστε πολλαπλά μπλοκ catch δοκιμής για να χειριστείτε τις εξαιρέσεις. Πολλαπλές εξαιρέσεις είναι χρήσιμες όταν?
- Θέλετε να εμφανίσετε ένα προσαρμοσμένο μήνυμα ανάλογα με την εξαίρεση που έχει γίνει
- Θέλετε να εκτελέσετε μια μοναδική λειτουργία ανάλογα με την εξαίρεση που έχει γίνει
Το παρακάτω διάγραμμα ροής δείχνει πώς λειτουργούν οι πολλαπλές εξαιρέσεις
Ας δούμε ένα παράδειγμα που χρησιμοποιεί πολλαπλές εξαιρέσεις.
Θα τροποποιήσουμε τον κωδικό που διαιρεί έναν αριθμό με τον παρονομαστή.
Αναμένουμε δύο είδη εξαιρέσεων.
- Διαίρεση με το μηδέν
- Διαίρεση με αρνητικό αριθμό
Για λόγους απλότητας, θα εμφανίζουμε μόνο τον τύπο εξαίρεσης στα μπλοκ αλίευσης.
Η ενσωματωμένη PHP στην κλάση Exception χρησιμοποιείται για τη δημιουργία εξαιρέσεων.
Θα δημιουργήσουμε δύο κλάσεις που επεκτείνουν την κλάση εξαιρέσεων και θα τις χρησιμοποιήσουμε για τη δημιουργία εξαιρέσεων.
Ο παρακάτω κώδικας δείχνει την υλοποίηση.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Δοκιμή του κώδικα
Θα υποθέσουμε ότι αποθηκεύσατε το multiple_exceptions.php στον φάκελο phptuts.
Περιηγηθείτε στη διεύθυνση URL http://localhost/phptuts/multiple_exceptions.php
Επιστρέψτε στο αρχείο PHP και περάστε το -1 ως παράμετρο όπως φαίνεται στο παρακάτω διάγραμμα.
Περιηγηθείτε στη διεύθυνση URL http://localhost/phptuts/multiple_exceptions.php.
Τι αποτελέσματα παίρνετε; Περάστε το 3 ως παράμετρο.
Τι αποτελέσματα παίρνετε;
Σύνοψη
- Τα σφάλματα είναι απροσδόκητα αποτελέσματα που παράγονται από κώδικα PHP
- Ο χειρισμός σφαλμάτων βελτιώνει την απόδοση της εφαρμογής
- Η PHP έχει ενσωματώσει συναρτήσεις που μπορούν να χρησιμοποιηθούν για την προσαρμογή του τρόπου με τον οποίο η PHP αναφέρει σφάλματα
- Οι εξαιρέσεις είναι σαν τα σφάλματα, αλλά μπορούν να συλληφθούν χρησιμοποιώντας το μπλοκ αλίευσης όταν πεταχτούν.
- Η εμφάνιση μηνυμάτων σφάλματος που εμφανίζουν πληροφορίες σφάλματος θεωρείται κακή πρακτική ασφαλείας.