Memperbarui:
Pada PHP 7.1, ini tersedia.
Sintaksnya adalah:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
Documents: https://www.php.net/manual/en/language.exceptions.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
Komit: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
Untuk PHP sebelum 7.1:
Terlepas dari apa yang dikatakan jawaban-jawaban lain ini, Anda dapat menangkap AError
dan BError
di blok yang sama (agak lebih mudah jika Anda yang menentukan pengecualian). Bahkan mengingat bahwa ada pengecualian yang ingin Anda "gagal", Anda masih harus dapat mendefinisikan hierarki yang sesuai dengan kebutuhan Anda.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
Kemudian:
catch(LetterError $e){
//voodoo
}
Seperti yang dapat Anda lihat di sini dan di sini , bahkan SPL
pengecualian standar memiliki hierarki yang dapat Anda manfaatkan. Selain itu, sebagaimana dinyatakan dalam Manual PHP :
Ketika pengecualian dilemparkan, kode yang mengikuti pernyataan tidak akan dieksekusi, dan PHP akan berusaha untuk menemukan blok tangkap pencocokan pertama.
Ini berarti Anda juga bisa memilikinya
class CError extends LetterError {}
yang perlu Anda tangani secara berbeda dari AError
atau BError
, sehingga pernyataan tangkapan Anda akan terlihat seperti ini:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
Jika Anda memiliki kasus di mana ada dua puluh atau lebih pengecualian yang secara sah berada di bawah superclass yang sama, dan Anda perlu menangani lima (atau kelompok besar apa pun) dari mereka satu arah dan sisanya dengan cara lain, Anda MASIH dapat melakukan ini.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
Lalu:
catch (Group1 $e) {}
Menggunakan OOP dalam hal pengecualian sangat kuat. Menggunakan hal-hal seperti get_class
atau instanceof
merupakan peretasan, dan harus dihindari jika memungkinkan.
Solusi lain yang ingin saya tambahkan adalah menempatkan fungsi penanganan pengecualian dalam metodenya sendiri.
Kamu bisa saja
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
Dengan asumsi sekali tidak ada cara Anda dapat mengontrol hierarki kelas pengecualian atau interface (dan ada hampir selalu akan menjadi cara), Anda dapat melakukan hal berikut:
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);
}
Dengan cara ini, Anda masih memiliki satu-satunya lokasi kode yang harus Anda modifikasi jika mekanisme penanganan pengecualian Anda perlu diubah, dan Anda bekerja dalam konstruksi umum OOP.