Aggiornare:
A partire da PHP 7.1, questo è disponibile.
La sintassi è:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
Documenti: https://www.php.net/manual/en/language.exceptions.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
Commit: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
Per PHP prima della 7.1:
Nonostante ciò che dicono queste altre risposte, puoi catturare AError
e BError
nello stesso blocco (è un po 'più semplice se sei tu a definire le eccezioni). Anche dato che ci sono delle eccezioni che vuoi "superare", dovresti comunque essere in grado di definire una gerarchia in base alle tue esigenze.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
Poi:
catch(LetterError $e){
//voodoo
}
Come puoi vedere qui e qui , anche le SPL
eccezioni predefinite hanno una gerarchia che puoi sfruttare. Inoltre, come indicato nel manuale di PHP :
Quando viene generata un'eccezione, il codice che segue l'istruzione non verrà eseguito e PHP tenterà di trovare il primo blocco catch corrispondente.
Questo significa che potresti anche avere
class CError extends LetterError {}
che devi gestire in modo diverso da AError
o BError
, quindi la tua dichiarazione catch dovrebbe apparire così:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
Se hai avuto il caso in cui c'erano venti o più eccezioni che appartenevano legittimamente alla stessa superclasse, e dovevi gestirne cinque (o qualunque gruppo di grandi dimensioni) in un modo e il resto nell'altro, puoi ANCORA farlo.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
E poi:
catch (Group1 $e) {}
L'uso di OOP quando si tratta di eccezioni è molto potente. Usare cose come get_class
o instanceof
sono hack e, se possibile, dovrebbe essere evitato.
Un'altra soluzione che vorrei aggiungere è quella di mettere la funzionalità di gestione delle eccezioni nel suo metodo.
Potresti avere
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
Supponendo che non sia assolutamente possibile controllare le gerarchie o le interfacce delle classi di eccezioni (e quasi sempre ci sarà un modo), è possibile effettuare le seguenti operazioni:
try
{
stuff()
}
catch(ExceptionA $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
$this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
$this->handleExceptionMethod2($e);
}
In questo modo, hai ancora un'unica posizione del codice che devi modificare se il meccanismo di gestione delle eccezioni deve cambiare e stai lavorando all'interno dei costrutti generali di OOP.