Güncelleme:
PHP 7.1'den itibaren bu kullanılabilir.
Sözdizimi:
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
Dokümanlar: https://www.php.net/manual/en/language.exceptions.php#example-287
RFC: https://wiki.php.net/rfc/multiple-catch
Tamamlama: https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
7.1'den önceki PHP için:
Bu cevaplar söylediklerine rağmen, yakalamak AError
ve BError
aynı blokta (eğer istisnalar tanımlayan biri ise biraz daha kolaydır). "Düşmek" istediğiniz istisnalar olsa bile, yine de ihtiyaçlarınıza uygun bir hiyerarşi tanımlayabilmelisiniz.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
Sonra:
catch(LetterError $e){
//voodoo
}
Burada ve burada görebileceğiniz gibi , SPL
varsayılan istisnalar bile kaldırabileceğiniz bir hiyerarşiye sahiptir. Ayrıca, PHP El Kitabında belirtildiği gibi :
Bir istisna atıldığında, ifadeyi izleyen kod yürütülmez ve PHP ilk eşleşen catch bloğunu bulmaya çalışır.
Bu, ayrıca
class CError extends LetterError {}
Eğer farklı işlemek zorunda olduğu AError
ya BError
, senin catch ifadesi şu şekilde görünecektir böylece:
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
Aynı süper sınıfa meşru olarak ait olan yirmi veya daha fazla istisna olduğu durumda ve bunlardan beşini (veya büyük ish grubunu) bir şekilde ve diğerlerini halletmeniz gerekiyorsa, bunu YAPABİLİRSİNİZ.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
Ve sonra:
catch (Group1 $e) {}
İstisnalar söz konusu olduğunda OOP kullanımı çok güçlüdür. Saldırı gibi get_class
veya instanceof
olmayan şeyler kullanmak ve mümkünse kaçınılmalıdır.
Eklemek istediğim bir diğer çözüm de istisna işleme işlevselliğini kendi yöntemine koymak.
Olabilir
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
İstisna sınıfı hiyerarşilerini veya arayüzlerini kontrol etmenin kesinlikle bir yolu olmadığını varsayarsak (ve neredeyse her zaman bir yol olacaktır ), aşağıdakileri yapabilirsiniz:
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);
}
Bu şekilde, istisna işleme mekanizmanızın değişmesi gerekiyorsa değiştirmek zorunda olduğunuz tek bir kod konumunuz vardır ve OOP'nin genel yapıları içinde çalışıyorsunuzdur.