PHP Δοκιμάστε το Catch Example: Exception & Error Handling Tutorial

Τι είναι η Εξαίρεση;

Ένα σφάλμα είναι ένα απροσδόκητο αποτέλεσμα προγράμματος που δεν μπορεί να χειριστεί το ίδιο το πρόγραμμα.

Τα σφάλματα επιλύονται με τη διόρθωση του προγράμματος. Ένα παράδειγμα σφάλματος θα ήταν ένας άπειρος βρόχος που δεν σταματά ποτέ να εκτελείται.

Μια εξαίρεση είναι το μη αναμενόμενο αποτέλεσμα προγράμματος που μπορεί να χειριστεί το ίδιο το πρόγραμμα.

Παραδείγματα εξαιρέσεων περιλαμβάνουν την προσπάθεια να ανοίξετε ένα αρχείο που δεν υπάρχει.

Αυτή η εξαίρεση μπορεί να αντιμετωπιστεί είτε δημιουργώντας το αρχείο είτε παρουσιάζοντας στον χρήστη την επιλογή αναζήτησης του αρχείου.

Γιατί να χειριστείτε την εξαίρεση;

  • Αποφύγετε απροσδόκητα αποτελέσματα στις σελίδες μας που μπορεί να είναι πολύ ενοχλητικά ή ενοχλητικά για τους τελικούς χρήστες μας
  • Βελτιώστε την ασφάλεια των εφαρμογών μας μη εκθέτοντας πληροφορίες που ενδέχεται να χρησιμοποιήσουν κακόβουλοι χρήστες για να επιτεθούν στις εφαρμογές μας
  • Οι εξαιρέσεις Php χρησιμοποιούνται για την αλλαγή της κανονικής ροής ενός προγράμματος εάν παρουσιαστεί κάποιο προβλέψιμο σφάλμα.

Χειρισμός σφαλμάτων PHP

Όταν παρουσιαστεί σφάλμα, ανάλογα με τις ρυθμίσεις διαμόρφωσης, PHP εμφανίζει το μήνυμα σφάλματος στο πρόγραμμα περιήγησης Ιστού με πληροφορίες σχετικά με το σφάλμα που παρουσιάστηκε.

Η PHP προσφέρει διάφορους τρόπους χειρισμού σφαλμάτων.

Θα εξετάσουμε τρεις (3) κοινώς χρησιμοποιούμενες μεθόδους.

  1. Die δηλώσεις– η λειτουργία die συνδυάζει τη λειτουργία ηχούς και εξόδου σε μία. Είναι πολύ χρήσιμο όταν θέλουμε να βγάλουμε ένα μήνυμα και να σταματήσουμε την εκτέλεση του σεναρίου όταν παρουσιαστεί κάποιο σφάλμα.
  2. Προσαρμοσμένοι χειριστές σφαλμάτων – αυτές είναι συναρτήσεις που ορίζονται από το χρήστη και καλούνται κάθε φορά που παρουσιάζεται σφάλμα.
  3. Αναφορά σφαλμάτων PHP – το μήνυμα σφάλματος ανάλογα με τις ρυθμίσεις αναφοράς σφαλμάτων PHP. Αυτή η μέθοδος είναι πολύ χρήσιμη σε περιβάλλον ανάπτυξης όταν δεν έχετε ιδέα τι προκάλεσε το σφάλμα. Οι πληροφορίες που εμφανίζονται μπορούν να σας βοηθήσουν να εντοπίσετε σφάλματα στην εφαρμογή σας.

Παραδείγματα χειρισμού σφαλμάτων

Ας δούμε τώρα μερικά απλά παραδείγματα με ρουτίνες χειρισμού σφαλμάτων.

Ας υποθέσουμε ότι έχουμε αναπτύξει μια εφαρμογή που χρησιμοποιεί αρχεία κειμένου για την αποθήκευση δεδομένων. Ίσως θέλουμε να ελέγξουμε την ύπαρξη του αρχείου προτού επιχειρήσουμε να διαβάσουμε δεδομένα από αυτό.

Ο παρακάτω κώδικας υλοποιεί το παραπάνω παράδειγμα.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Αν υποθέσουμε ότι αποθηκεύσατε το αρχείο simple_error.php στον φάκελο phptuts, ανοίξτε τη διεύθυνση URL http://localhost/phptuts/simple_error.php

Θα λάβετε τα ακόλουθα αποτελέσματα

Χειρισμός σφαλμάτων 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 Exception Handle στην 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 θα λάβετε τα ακόλουθα αποτελέσματα

. Χειρισμός σφαλμάτων 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 Exception Handle στην PHP

Θα εξετάσουμε τώρα ένα παράδειγμα που εφαρμόζει τις εξαιρέσεις ρίψεων και συλλήψεων.

Θα τροποποιήσουμε το παραπάνω παράδειγμα και θα συμπεριλάβουμε τη δοκιμή, τη ρίψη και τη σύλληψη.

Έχει την εξής βασική σύνταξη.

<?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 Exception Handle στην 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 Exception Handle στην PHP

Επιστρέψτε στο αρχείο PHP και περάστε το -1 ως παράμετρο όπως φαίνεται στο παρακάτω διάγραμμα.

PHP Exception Handle στην PHP

Περιηγηθείτε στη διεύθυνση URL http://localhost/phptuts/multiple_exceptions.php.

Τι αποτελέσματα παίρνετε; Περάστε το 3 ως παράμετρο.

Τι αποτελέσματα παίρνετε;

Σύνοψη

  • Τα σφάλματα είναι απροσδόκητα αποτελέσματα που παράγονται από κώδικα PHP
  • Ο χειρισμός σφαλμάτων βελτιώνει την απόδοση της εφαρμογής
  • Η PHP έχει ενσωματώσει συναρτήσεις που μπορούν να χρησιμοποιηθούν για την προσαρμογή του τρόπου με τον οποίο η PHP αναφέρει σφάλματα
  • Οι εξαιρέσεις είναι σαν τα σφάλματα, αλλά μπορούν να συλληφθούν χρησιμοποιώντας το μπλοκ αλίευσης όταν πεταχτούν.
  • Η εμφάνιση μηνυμάτων σφάλματος που εμφανίζουν πληροφορίες σφάλματος θεωρείται κακή πρακτική ασφαλείας.