최신 정보:
PHP 7.1부터 사용할 수 있습니다.
구문은 다음과 같습니다.
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
문서 : https://www.php.net/manual/en/language.exceptions.php#example-287
RFC : https://wiki.php.net/rfc/multiple-catch
커밋 : https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
7.1 이전의 PHP :
이러한 다른 답변의 말에도 불구하고, 당신은 잡을 수 AError
와 BError
같은 블록에 (당신이 예외를 정의하는 하나의 경우는 다소 쉽다). "중단"하려는 예외가 있다고해도 필요에 맞게 계층을 정의 할 수 있어야합니다.
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
그때:
catch(LetterError $e){
//voodoo
}
여기 와 여기 에서 볼 수 있듯이 SPL
기본 예외 조차도 활용할 수있는 계층 구조가 있습니다. 또한 PHP 매뉴얼에 명시된 바와 같이 :
예외가 발생하면 명령문 뒤의 코드가 실행되지 않고 PHP는 첫 번째 일치하는 catch 블록을 찾으려고 시도합니다.
이것은 또한 당신이 가질 수 있음을 의미합니다
class CError extends LetterError {}
당신이 다르게 처리해야하는 AError
나 BError
, 당신의 catch 문은 다음과 같이 할 수 있도록 :
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
동일한 수퍼 클래스에 합법적으로 속한 20 개 이상의 예외가 있고 그 중 5 개 (또는 큰 그룹)를 한 가지 방법으로 처리해야하고 나머지는 다른 방법으로 처리해야하는 경우에도 여전히이를 수행 할 수 있습니다.
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
그리고:
catch (Group1 $e) {}
예외와 관련하여 OOP를 사용하는 것은 매우 강력합니다. 사용 일이 좋아 get_class
하거나 instanceof
해킹하고, 가능하면 피해야한다.
추가하고 싶은 또 다른 솔루션은 예외 처리 기능을 자체 메서드에 넣는 것입니다.
당신은 할 수 있었다
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
예외 클래스 계층 또는 인터페이스를 제어 할 수있는 방법이 전혀 없다고 가정하면 (그리고 거의 항상 방법 이 있을 것입니다) 다음을 수행 할 수 있습니다.
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);
}
이러한 방식으로 예외 처리 메커니즘을 변경해야하는 경우 수정해야하는 유일한 단일 코드 위치가 있으며 일반적인 OOP 구성 내에서 작업하고 있습니다.