Ultimele tutoriale de dezvoltare web
 

PHP Excepție de manipulare


Excepțiile sunt folosite pentru a schimba fluxul normal al unui scenariu în cazul în care apare o eroare specificat.


Ce este o excepție

Cu PHP 5 a venit un nou mod orientat obiect de a face cu erori.

Excepție de manipulare este folosit pentru a schimba fluxul normal al execuției codului în cazul în care o eroare specifică (exceptional) se produce fenomenul. Această condiție se numește o excepție.

Aceasta este ceea ce se întâmplă în mod normal, atunci când o excepție este declanșată:

  • Starea codului curent este salvat
  • Execuția cod va trece la un predefinit (custom) funcția de tratare a excepție
  • În funcție de situație, handler poate relua apoi executarea din starea de cod salvat, termina executarea script-ul sau de a continua script-ul dintr-o locație diferită în codul

Vom arăta diferite metode de tratare a erorilor:

  • Utilizarea de bază de excepții
  • Crearea unui handler de excepție personalizată
  • excepții multiple
  • Re-a aruncat o excepție
  • Setarea unui handler excepție de nivel superior

Note: Excepțiile trebuie utilizat numai cu condiții de eroare, și nu ar trebui să fie utilizate pentru a sări la un alt loc în codul de la un punct specificat.


Utilizarea de bază de excepții

Atunci când o excepție este aruncată, codul de mai jos nu va fi executat, iar PHP va încerca să găsească potrivire "catch" bloc.

În cazul în care o excepție nu este prins, o eroare fatală va fi emisă cu un "Uncaught Exception" mesajul.

Să încercăm să arunce o excepție fără să-l prindă:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception
checkNum(2);
?>

Codul de mai sus va primi o eroare de genul:

Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Încercați, arunca și de captură

Pentru a evita eroarea din exemplul de mai sus, avem nevoie pentru a crea codul adecvat pentru a gestiona o excepție.

Codul corect excepție ar trebui să includă:

  1. Încercați - O funcție folosind o excepție ar trebui să fie într - un "try" bloc. Dacă excepția nu declanșează, codul va continua în mod normal. Cu toate acestea , dacă excepția declanșează, o excepție este "thrown"
  2. Arunca - Acesta este modul în care declanșează o excepție. Fiecare "throw" trebuie să aibă cel puțin o "catch"
  3. Catch - Un "catch" bloc preia o excepție și creează un obiect care conține informația excepție

Să încercăm să declanșeze o excepție cu un cod valid:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception in a "try" block
try {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
}

//catch exception
catch(Exception $e) {
  echo 'Message: ' .$e->getMessage();
}
?>

Codul de mai sus va primi o eroare de genul:

Message: Value must be 1 or below

Exemplu explicat:

Codul de mai sus aruncă o excepție și prinde-l:

  1. checkNum() este creat funcția. Se verifică dacă un număr este mai mare decât 1. Dacă este, o excepție este aruncată
  2. checkNum() funcția este numit într - un "try" bloc
  3. Excepția în cadrul checkNum() funcția este aruncată
  4. "catch" bloc preia excepția și creează un obiect ($e) care conține informațiile excepție
  5. Mesajul de eroare de excepție se regăsește prin apel la $e-> getMessage() din obiectul excepție

Cu toate acestea, o modalitate de a obține în jurul valorii de "every throw must have a catch" regula este de a stabili un handler de excepție de nivel superior să se ocupe de erori care a scăpat.


Crearea unei excepții de clasă personalizată

Pentru a crea un handler de excepție personalizată, trebuie să creați o clasă specială cu funcții care pot fi apelate atunci când are loc o excepție în PHP. Clasa trebuie să fie o extensie a clasei excepție.

Clasa excepție personalizată moștenește proprietățile din clasa excepție PHP și puteți adăuga funcții personalizate la acesta.

Permite crea o clasă de excepție:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

Noua clasă este o copie a clasei excepție vechi , cu un adaos de errorMessage() funcția. Deoarece este o copie a clasei vechi, și moștenește proprietățile și metodele din clasa vechi, putem folosi metode de clasă excepție , cum ar fi getLine() și getFile() și getMessage() .

Exemplu explicat:

Codul de mai sus aruncă o excepție și prinde-l cu o clasă excepție personalizată:

  1. customException() clasa este creată ca o extensie a clasei excepție vechi. În acest fel moștenește toate metodele și proprietățile din clasa excepție vechi
  2. errorMessage() este creat funcția. Această funcție returnează un mesaj de eroare dacă o adresă de e-mail nu este validă
  3. Variabila $ e-mail este setat la un șir de caractere care nu este o adresă de e-mail validă
  4. "try" blocul este executat și o excepție este aruncată de la adresa de e-mail nu este validă
  5. "catch" bloc prinde excepția și afișează mesajul de eroare

excepţii multiple

Este posibil ca un script pentru a utiliza mai multe excepții pentru a verifica pentru mai multe condiții.

Este posibil să se utilizeze mai multe blocuri if..else, un comutator sau cuib mai multe excepții. Aceste excepții se pot folosi diferite clase de excepție și pentru a reveni diferite mesaje de eroare:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

catch (customException $e) {
  echo $e->errorMessage();
}

catch(Exception $e) {
  echo $e->getMessage();
}
?>

Exemplu explicat:

Codul de testele de mai sus două condiții și aruncă o excepție în cazul în care oricare dintre aceste condiții nu sunt îndeplinite:

  1. customException() clasa este creată ca o extensie a clasei excepție vechi. În acest fel moștenește toate metodele și proprietățile din clasa excepție vechi
  2. errorMessage() este creat funcția. Această funcție returnează un mesaj de eroare dacă o adresă de e-mail nu este validă
  3. Variabila $ e - mail este setat la un șir de caractere care este o adresă de e - mail validă, dar conține șirul "example"
  4. "try" blocul este executat și o excepție nu este aruncat pe prima condiție
  5. A doua condiție declanșează o excepție de la e-mail-ul conține șirul de caractere "example"
  6. "catch" bloc prinde excepția și afișează mesajul de eroare corect

Dacă excepția aruncată erau din customException de clasă și nu au nici o captură customException, doar captura excepție de bază, excepția ar fi manipulate acolo.


Re-aruncare Excepții

Uneori, atunci când o excepție este aruncată, ați putea dori să-l ocupe în mod diferit decât modul standard. Este posibil să se arunce o excepție a doua oară într - o "catch" bloc.

Un script ar trebui să ascundă erori de sistem de la utilizatori. erori de sistem poate fi important pentru codor, dar nu sunt de interes pentru utilizator. Pentru a face lucrurile mai ușor pentru utilizator puteți re-arunca excepție cu un mesaj prietenos utilizator:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  try {
    //check for "example" in mail address
    if(strpos($email, "example") !== FALSE) {
      //throw exception if email is not valid
      throw new Exception($email);
    }
  }
  catch(Exception $e) {
    //re-throw exception
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

Exemplu explicat:

Codul de mai sus în cazul în care testele de e - mail-adresa conține șirul de caractere "example" în ea, în cazul în care o face, excepția este re-aruncat:

  1. customException() clasa este creată ca o extensie a clasei excepție vechi. În acest fel moștenește toate metodele și proprietățile din clasa excepție vechi
  2. errorMessage() este creat funcția. Această funcție returnează un mesaj de eroare dacă o adresă de e-mail nu este validă
  3. Variabila $ e - mail este setat la un șir de caractere care este o adresă de e - mail validă, dar conține șirul "example"
  4. "try" bloc conține un alt "try" bloc pentru a face posibilă re-arunca excepția
  5. Excepția este declanșată , deoarece e-mail-ul conține șirul de caractere "example"
  6. "catch" bloc prinde excepția și re-aruncă o "customException"
  7. "customException" este prins și afișează un mesaj de eroare

Dacă excepția nu este prinsă în actualul său "try" bloc, acesta va căuta un bloc de captură pe "higher levels" .


Setați o excepție Handler Top Level

set_exception_handler() funcția stabilește o funcție definită de utilizator să se ocupe de toate excepțiile neînregistrate.

<?php
function myException($exception) {
  echo "<b>Exception:</b> " . $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>

Ieșirea codului de mai sus ar trebui să fie ceva de genul:

Exception: Uncaught Exception occurred

În codul de mai sus nu a existat nici o "catch" bloc. În schimb, handler excepție de nivel superior a declanșat. Această funcție trebuie folosită pentru a prinde excepții neînregistrate.


Reguli pentru excepții

  • Codul poate fi înconjurat într-un bloc try, pentru a ajuta la captura potențiale excepții
  • Fiecare bloc sau încercați "throw" trebuie să aibă cel puțin un bloc de captură corespunzător
  • blocuri de captură multiple pot fi folosite pentru a prinde diferite clase de excepții
  • Excepțiile pot fi aruncate (or re-thrown) într - un bloc de captură într - un bloc try

O regulă simplă: Dacă arunci ceva, trebuie să-l prind.