98 Try e Catch – Le eccezioni
Le eccezioni sono un’anomalia rispetto al normale flusso che, una volta sollevata, può essere catturata.
Già dalla versione 5 di php esisteva la classe Exception che se veniva estesa permetteva la creazione di regole particolari che potevamo costruire.
Da php 7 la classe Exception deve essere estesa tramite l’interfaccia di base Throwable presente di default in php. Per dettagli e i metodi dell’interfaccia rimando alla guida ufficiale. Per estendere la classe Exception si utilizza la keyword throw che significa lancia :
throw new Exception('non esiste');
Questo comando significa lancia una nuova eccezione e il parametro passato alla classe Exception è il messaggio.
Possiamo anche passare come secondo parametro un codice di errore per eventualmente fornire un riferimento sul codice che genera l’errore
throw new Exception('non esiste', -15);
creiamo una classe con un metodo che stampa il valore di una proprietà
class pippo {
public $prop = 'hola';
public function funz($p) {
echo $this->prop = $p;
}
}
facciamo un controllo se viene passato un valore inferiore a 10 stampiamo il valore oppure solleviamo un eccezione se è maggiore di 10
class pippo {
public $prop = 'hola';
public function funz($p) {
if ($p < 10) {
echo $this->prop = $p;
} else {
throw new Exception('NON ESISTE NULLA', -15);
}
}
}
se adesso lanciamo il metodo creando l’oggetto senza passare valore, otterremo l’errore
$a = new pippo(); $a->funz();
try catch
adesso invece di eseguire il metodo, cerchiamo di eseguirlo, tramile l’istruzione try { }
try {
$a = new pippo();
$a->funz('p');
}
stiamo dicendo prova ad eseguire il metodo funz passando la stringa ‘p’ come parametro.
Ci manca adesso la parte dove catturiamo l’eccezione tramite il blocco catch()
try {
$a = new pippo();
$a->funz('p');
} catch () {
}
Il blocco catch riceve di default da php un oggetto passato come parametro a cui daremo un nome a nostro piacere che per convenzione spesso viene chiamato $e (iniziale di error). Questo oggetto potrà essere di diversi tipi, quello più utilizzato è un oggetto di tipo Exception
catch (Exception $e) { }
a questo punto all’interno del blocco catch restituiremo l’errore catturato definito nel lancio dell’eccezione usufruendo del metodo predefinito getMessage() della classe Exception
catch (Exception $e) {
echo $e->getMessage();
}
La classe Exception ha diversi metodi consultabili qui, per esempio possiamo anche far restituire il codice di errore grazie al metodo getcode()
catch (Exception $e) {
echo $e->getMessage();
echo $e->getCode();
}
ecco il codice completo
class pippo {
public $prop = 'hola';
public function funz($p) {
if ($p<10) {
echo $this->prop = $p;
} else {
throw new Exception('NON ESISTE NULLA', -15);
}
}
}
try {
$a = new pippo();
$a->funz(11);
} catch (Exception $e) {
echo $e->getMessage();
echo $e->getCode();
}
Finally
Abbiamo visto che il blocco try / catch prova ad eseguire delle istruzioni nella parte try che se funzionano vengono eseguite, altrimenti viene catturata un eccezione e vengono eseguite delle azioni di loggin nel blocco catch. Si può chiudere il blocco con l’aggiunta del , costrutto finally che comunque viene sempre eseguito, indipendentemente dall’esito
try {
$a = new pippo();
$a->funz(1);
} catch (Exception $e) {
echo $e->getMessage();
echo $e->getCode();
} finally {
echo 'codice finito';
}