최신 웹 개발 튜토리얼
 

PHP예외 처리


예외는 지정된 오류가 발생하면 스크립트의 일반적인 흐름을 변경하는 데 사용됩니다.


예외 란 무엇인가

PHP 5로 오류를 처리하는 새로운 객체 지향 방법을했다.

예외 처리는 특정 에러가 있으면 코드 실행의 통상의 흐름을 변경하기 위해 사용된다 (exceptional) 조건이 발생한다. 이 조건은 예외라고합니다.

이 예외가 트리거 될 때 일반적으로 발생하는 것입니다 :

  • 현재 코드 상태가 저장됩니다
  • 코드의 실행이 소정의 전환한다 (custom) 예외 핸들러 함수
  • 상황에 따라, 핸들러는 저장된 코드 상태에서 실행을 다시 시작 스크립트의 실행을 종료하거나 코드에서 다른 위치에서 스크립트를 계속 사용할 수 있습니다

우리는 다른 오류 처리 방법을 표시합니다 :

  • 예외의 기본 사용
  • 사용자 정의 예외 핸들러 만들기
  • 여러 예외
  • 다시 던지는 예외를
  • 최상위 예외 핸들러를 설정

Note: 예외는 오류 상태와 함께 사용되어야하고, 특정 지점에서 코드에서 다른 장소로 이동하는 데 사용되어서는 안된다.


예외의 기본 사용

예외가 발생하면 코드는 실행되지 않습니다 다음, 그리고 PHP는 일치 찾기 위해 노력할 것 "catch" 블록.

예외가 잡힌되지 않으면 치명적인 오류는 발급 될 것 "Uncaught Exception" 메시지.

그것을 잡는하지 않고 예외를 발생하려고하자 :

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception
checkNum(2);
?>

위의 코드는이 같은 오류가 발생합니다 :

Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

, 시도 던져 캐치

위의 예에서 오류가 발생하지 않도록하기 위해, 우리는 예외를 처리 할 수있는 적절한 코드를 작성해야합니다.

적절한 예외 코드가 포함되어야한다 :

  1. 시도 - 함수를에 있어야 예외를 사용하여 "try" 블록. 예외가 트리거되지 않습니다 경우 코드는 정상적으로 계속됩니다. 예외가 트리거 그러나 경우, 예외가있다 "thrown"
  2. 던져 - 당신이 예외를 트리거하는 방법이있다. 각 "throw" 적어도 하나가 있어야합니다 "catch"
  3. 캐치 - "catch" 블록 예외를 검색 및 예외 정보를 포함하는 객체를 생성

유효한 코드로 예외를 유발하려고하자 :

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception in a "try" block
try {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
}

//catch exception
catch(Exception $e) {
  echo 'Message: ' .$e->getMessage();
}
?>

위의 코드는이 같은 오류가 발생합니다 :

Message: Value must be 1 or below

예 설명 :

위의 코드는 예외가 발생하고 그것을 잡는다 :

  1. checkNum() 함수가 생성된다. 숫자가있는 경우, 예외가 발생 1보다 큰 경우는 검사
  2. checkNum() 함수는 호출한다 "try" 블록
  3. 내의 예외 checkNum() 함수는 슬로우
  4. "catch" 블록은 예외를 검출하고, 오브젝트를 생성 ($e) 제외하고 정보를 포함
  5. 예외로부터의 에러 메시지를 호출하여 반향된다 $e-> getMessage() 을 제외한 객체로부터

그러나 한 방법은 주위에 얻을 "every throw must have a catch" 규칙을 통해 미끄러 오류를 처리 할 수있는 최고 수준의 예외 처리기를 설정하는 것입니다.


사용자 정의 예외 클래스 만들기

당신이 예외가 발생했을 때 호출 될 수있는 기능과 함께 특별한 클래스를 작성해야합니다 사용자 정의 예외 처리기를 만듭니다. 이 클래스는 예외 클래스의 확장해야합니다.

사용자 정의 예외 클래스는 PHP의 예외 클래스로부터 속성을 상속 당신은 그것을 사용자 정의 기능을 추가 할 수 있습니다.

예외 클래스를 생성 할 수 있습니다 :

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

새로운 클래스의 첨가 이전 예외 클래스의 복사 errorMessage() 함수. 그것은 기존의 클래스의 사본이며, 이전 클래스로부터 속성과 메소드를 상속하기 때문에, 우리는 같은 예외 클래스 메소드 사용 getLine()getFile()getMessage() .

예 설명 :

위의 코드는 예외가 발생하고 사용자 정의 예외 클래스로 잡는다 :

  1. customException() 클래스가 이전 예외 클래스의 확장으로 생성됩니다. 이 방법은 이전 예외 클래스의 모든 메서드와 속성을 상속
  2. errorMessage() 함수가 생성된다. 전자 메일 주소가 유효하지 않은 경우이 함수는 오류 메시지를 반환
  3. 은 $ 이메일 변수가 유효한 이메일 주소가 아닌 문자열로 설정
  4. "try" 블록이 실행됩니다 및 전자 메일 주소가 잘못이기 때문에 예외가 발생합니다
  5. "catch" 블록에 예외를 catch 한 오류 메시지를 표시

여러 예외

스크립트에 여러 조건을 확인하기 위해 여러 예외를 사용하는 것이 가능하다.

여러에서는 if..else 블록, 스위치, 또는 둥지 여러 예외를 사용하는 것이 가능하다. 이러한 예외는 다른 예외 클래스를 사용하고 다른 오류 메시지를 반환 할 수 있습니다 :

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

catch (customException $e) {
  echo $e->errorMessage();
}

catch(Exception $e) {
  echo $e->getMessage();
}
?>

예 설명 :

코드 위의 두 조건을 테스트하고 조건이 충족되지 않는 경우 예외를 발생 :

  1. customException() 클래스가 이전 예외 클래스의 확장으로 생성됩니다. 이 방법은 이전 예외 클래스의 모든 메서드와 속성을 상속
  2. errorMessage() 함수가 생성된다. 전자 메일 주소가 유효하지 않은 경우이 함수는 오류 메시지를 반환
  3. 은 $ 이메일 변수는 유효한 이메일 주소 인 문자열로 설정하지만, 문자열이 포함되어 있습니다 "example"
  4. "try" 블록이 실행되고, 예외는 첫 번째 조건에서 발생되지
  5. 이메일 문자열 포함하기 때문에 두 번째 조건은 예외를 유발 "example"
  6. "catch" 블록은 예외를 catch하고 올바른 오류 메시지를 표시

던져진 예외는 클래스 customException의이었고, 더 customException 캐치는 기본 예외 캐치는 예외가 처리 할 것입니다,이 없다면.


다시 던지는 예외

예외가 발생하면 때때로, 당신은 표준 방법보다 다르게 처리 할 수 ​​있습니다. 내부 예외를 두 번 던질 수있다 "catch" 블록.

스크립트는 사용자의 시스템 오류를 숨겨야합니다. 시스템 오류는 코더에 대한 중요하지만, 사용자에게 전혀 관심있는 수 있습니다. 사용자에 대한 것들을 쉽게 만들려면 당신은 사용자 친화적 인 메시지와 함께 예외를 다시 던질 수 :

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  try {
    //check for "example" in mail address
    if(strpos($email, "example") !== FALSE) {
      //throw exception if email is not valid
      throw new Exception($email);
    }
  }
  catch(Exception $e) {
    //re-throw exception
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

예 설명 :

테스트 위의 코드는 이메일 주소는 문자열이 포함 된 경우 "example" 가 않는 경우, 예외가 다시 발생합니다, 그것에를 :

  1. customException() 클래스가 이전 예외 클래스의 확장으로 생성됩니다. 이 방법은 이전 예외 클래스의 모든 메서드와 속성을 상속
  2. errorMessage() 함수가 생성된다. 전자 메일 주소가 유효하지 않은 경우이 함수는 오류 메시지를 반환
  3. 은 $ 이메일 변수는 유효한 이메일 주소 인 문자열로 설정하지만, 문자열이 포함되어 있습니다 "example"
  4. "try" 블록은 다른 포함 "try" 가능 예외를 다시 던질 수 있도록 블록을
  5. 전자 메일이 문자열을 포함하고 있기 때문에 예외가 트리거됩니다 "example"
  6. "catch" 블록은 예외를 캐치하고 재 - 발생 "customException"
  7. "customException" 잡은하고 오류 메시지를 표시한다

예외가 현재에 걸려 있지 않은 경우 "try" 블록, 그것은에 catch 블록을 검색합니다 "higher levels" .


최상위 예외 핸들러를 설정

set_exception_handler() 함수는 모든 캐치되지 않는 예외를 처리하기 위해 사용자 정의 함수를 설정한다.

<?php
function myException($exception) {
  echo "<b>Exception:</b> " . $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>

위 코드의 출력 결과는 아래와 같습니다 :

Exception: Uncaught Exception occurred

코드에서 위의 어떤 없었다 "catch" 블록. 대신에, 최상위 예외 핸들러가 트리거. 이 기능은 캐치되지 않는 예외를 잡기 위해 사용되어야한다.


예외 규칙

  • 코드는 잠재적 인 예외를 잡을 수 있도록, try 블록에 둘러싸여 할 수있다
  • 각 블록 또는 시도 "throw" catch 블록 최소한 하나의 대응이 있어야합니다
  • 여러 catch 블록은 예외의 다른 클래스를 잡을 수 있습니다
  • 예외가 발생 될 수있다 (or re-thrown) try 블록 내에서 catch 블록에서

간단한 규칙 : 당신이 뭔가를 던질 경우, 당신은 그것을 잡을해야합니다.