Gli ultimi tutorial di sviluppo web
 

PHP La gestione delle eccezioni


Le eccezioni vengono utilizzati per modificare il normale flusso di uno script, se si verifica un errore specificato.


Che cosa è un'eccezione

Con PHP 5 è venuto un nuovo modo orientato agli oggetti di trattare con gli errori.

La gestione delle eccezioni viene utilizzato per modificare il normale flusso del esecuzione di codice se un errore specificato (exceptional) si verifica condizione. Questa condizione è chiamata un'eccezione.

Questo è ciò che normalmente accade quando viene attivato un'eccezione:

  • Lo stato di codice corrente viene salvata
  • L'esecuzione di codice passa ad un predefinito (custom) la funzione di gestione delle eccezioni
  • A seconda della situazione, il gestore può quindi riprendere l'esecuzione da parte dello Stato codice memorizzato, terminare l'esecuzione dello script o continuare lo script da una posizione diversa nel codice

Mostreremo diversi metodi di gestione degli errori:

  • Utilizzo di base di eccezioni
  • La creazione di un gestore di eccezioni personalizzato
  • più eccezioni
  • Re-un'eccezione
  • L'impostazione di un gestore di eccezioni di alto livello

Note: Le eccezioni dovrebbero essere utilizzati solo con le condizioni di errore, e non devono essere utilizzati per passare a un altro posto nel codice in un punto specifico.


L'uso di base di eccezioni

Quando viene generata un'eccezione, il seguente codice non verrà eseguito, e PHP cercherà di trovare l'abbinamento "catch" blocco.

Se un'eccezione non viene catturato, un errore fatale verrà rilasciato con un "Uncaught Exception" messaggio.

Proviamo a un'eccezione senza prendere esso:

<?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);
?>

Il codice di cui sopra otterrà un errore come questo:

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

Provate, gettare e cattura

Per evitare l'errore dal precedente esempio, abbiamo bisogno di creare il codice corretto di gestire un'eccezione.

codice di eccezione corretta dovrebbe includere:

  1. Prova - Una funzione utilizzando un'eccezione dovrebbe essere in un "try" a blocchi. Se l'eccezione non attiva, il codice continuerà normalmente. Tuttavia, se l'eccezione innesca, un'eccezione viene "thrown"
  2. Gettare - Ecco come si attiva un'eccezione. Ogni "throw" deve avere almeno un "catch"
  3. Catch - Un "catch" blocco recupera un'eccezione e crea un oggetto che contiene le informazioni sull'eccezione

Proviamo a innescare un'eccezione con codice valido:

<?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();
}
?>

Il codice di cui sopra otterrà un errore come questo:

Message: Value must be 1 or below

Esempio spiegato:

Il codice precedente genera un'eccezione e la riprende:

  1. Il checkNum() viene creata la funzione. Verifica se un numero è maggiore di 1. Se lo è, viene generata un'eccezione
  2. Il checkNum() funzione viene chiamata in un "try" blocco
  3. L'eccezione all'interno del checkNum() la funzione è gettato
  4. La "catch" blocco recupera l'eccezione e crea un oggetto ($e) che contiene le informazioni sull'eccezione
  5. Il messaggio di errore dal l'eccezione fa eco chiamando $e-> getMessage() dall'oggetto eccezione

Tuttavia, un modo per aggirare la "every throw must have a catch" regola è di impostare un gestore di eccezioni alto livello per gestire gli errori che sfuggono.


Creazione di una classe di eccezione personalizzata

Per creare un gestore di eccezioni personalizzato è necessario creare una classe speciale con le funzioni che possono essere chiamate quando si verifica un'eccezione in PHP. La classe deve essere un'estensione della classe di eccezione.

La classe di eccezione personalizzata eredita le proprietà dalla classe di eccezione di PHP ed è possibile aggiungere funzioni personalizzate ad esso.

Consente di creare una classe di eccezione:

<?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();
}
?>

La nuova classe è una copia della vecchia classe di eccezione con l'aggiunta del errorMessage() la funzione. Poiché si tratta di una copia della vecchia classe, ed eredita le proprietà ei metodi della vecchia classe, possiamo usare i metodi della classe eccezione come getLine() e getFile() e getMessage() .

Esempio spiegato:

Il codice precedente genera un'eccezione e la riprende con una classe eccezione personalizzata:

  1. Il customException() classe viene creata come un'estensione della vecchia classe di eccezioni. In questo modo eredita tutti i metodi e le proprietà della vecchia classe di eccezione
  2. errorMessage() viene creata la funzione. Questa funzione restituisce un messaggio di errore se un indirizzo e-mail non è valido
  3. La variabile $ email è impostato su una stringa che non è un indirizzo email valido
  4. La "try" blocco viene eseguito e viene generata un'eccezione dal momento che l'indirizzo e-mail non è valido
  5. La "catch" blocco rileva l'eccezione e visualizza il messaggio di errore

eccezioni multiple

E 'possibile per uno script per utilizzare più eccezioni per verificare la presenza di più condizioni.

È possibile utilizzare più blocchi if..else, un interruttore o nido più eccezioni. Queste eccezioni possono utilizzare diverse classi di eccezioni e tornare diversi messaggi di errore:

<?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();
}
?>

Esempio spiegato:

Il codice precedente verifica due condizioni e genera un'eccezione se una delle condizioni non sono soddisfatte:

  1. Il customException() classe viene creata come un'estensione della vecchia classe di eccezioni. In questo modo eredita tutti i metodi e le proprietà della vecchia classe di eccezione
  2. errorMessage() viene creata la funzione. Questa funzione restituisce un messaggio di errore se un indirizzo e-mail non è valido
  3. La variabile $ email è impostato su una stringa che è un indirizzo email valido, ma contiene la stringa "example"
  4. La "try" blocco viene eseguito e un'eccezione non viene gettato sul prima condizione
  5. La seconda condizione provoca un'eccezione dal momento che l'e-mail contiene la stringa "example"
  6. La "catch" blocco rileva l'eccezione e visualizza il messaggio di errore corretto

Se l'eccezione generata erano della customException di classe e non c'erano nessun fermo customException, solo la cattura un'eccezione di base, l'eccezione sarebbe stato gestito lì.


Ri-generazione di eccezioni

A volte, quando viene generata un'eccezione, si potrebbe desiderare di gestire in modo diverso rispetto al modo standard. E 'possibile generare un'eccezione per la seconda volta in una "catch" del blocco.

Uno script dovrebbe nascondere errori di sistema degli utenti. Errori di sistema può essere importante per il codificatore, ma non sono di alcun interesse per l'utente. Per rendere le cose più facile per l'utente che si può ri-generare l'eccezione con un utente messaggio amichevole:

<?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();
}
?>

Esempio spiegato:

Il codice di cui sopra test se l'indirizzo di posta elettronica contiene la stringa "example" in esso, se lo fa, l'eccezione viene ri-gettato:

  1. Il customException() classe viene creata come un'estensione della vecchia classe di eccezioni. In questo modo eredita tutti i metodi e le proprietà della vecchia classe di eccezione
  2. errorMessage() viene creata la funzione. Questa funzione restituisce un messaggio di errore se un indirizzo e-mail non è valido
  3. La variabile $ email è impostato su una stringa che è un indirizzo email valido, ma contiene la stringa "example"
  4. La "try" blocco contiene un'altra "try" blocco di rendere possibile per ri-generare l'eccezione
  5. L'eccezione viene attivato dal momento che la e-mail contiene la stringa "example"
  6. La "catch" blocco cattura l'eccezione e ri-lancia un "customException"
  7. Il "customException" e 'colto e visualizza un messaggio di errore

Se l'eccezione non viene catturato nella sua attuale "try" a blocchi, si cercherà un blocco catch on "higher levels" .


Impostare un gestore delle eccezioni di primo livello

Il set_exception_handler() funzione imposta una funzione definita dall'utente per gestire tutte le eccezioni non rilevati.

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

set_exception_handler('myException');

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

L'uscita del codice di cui sopra dovrebbe essere qualcosa di simile a questo:

Exception: Uncaught Exception occurred

Nel codice di cui sopra non c'era "catch" blocco. Al contrario, il gestore di eccezioni di alto livello attivato. Questa funzione dovrebbe essere utilizzata per intercettare le eccezioni non gestite fanno.


Regole per le eccezioni

  • Codice può essere circondato in un blocco try, per aiutare a catturare potenziali eccezioni
  • Ogni provare blocco o "throw" devono avere almeno un corrispondente blocco catch
  • blocchi catch multipli possono essere utilizzati per la cattura di diverse classi di eccezioni
  • Le eccezioni possono essere gettati (or re-thrown) in un blocco catch all'interno di un blocco try

Una semplice regola: se si lancia qualcosa, bisogna prenderlo.