수색…


오류보고 설정 및 표시 위치

php.ini에서 아직 수행되지 않은 경우, 오류보고를 동적으로 설정할 수 있으며 대부분의 오류를 표시 할 수 있도록 설정해야합니다.

통사론

int error_reporting ([ int $level ] )

예제들

// should always be used prior to 5.4
error_reporting(E_ALL);

// -1 will show every possible error, even when new levels and constants are added 
// in future PHP versions. E_ALL does the same up to 5.4.
error_reporting(-1);

// without notices
error_reporting(E_ALL & ~E_NOTICE);

// only warnings and notices.
// for the sake of example, one shouldn't report only those
error_reporting(E_WARNING | E_NOTICE);

오류는 PHP에 의해 기본적으로 기록되며, 보통 실행중인 스크립트와 같은 수준의 error.log 파일에 기록됩니다.

개발 환경에서는 화면에 표시 할 수 있습니다.

ini_set('display_errors', 1);

그러나 생산에서는

ini_set('display_errors', 0);

예외 또는 오류 처리기를 사용하여 친숙한 문제 메시지를 표시합니다.

예외 및 오류 처리

시도 / 잡기

try..catch 블록은 예외 가 발생할 수있는 프로그램의 흐름을 제어하는 ​​데 사용될 수 있습니다. PHP가 멈추지 않을 때 정상적으로 잡히고 처리 될 수 있습니다.

try {
    // Do a bunch of things...
    throw new Exception('My test exception!');
} catch (Exception $ex) {
    // Your logic failed. What do you want to do about that? Log it:
    file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}

위의 예는 try 블록에서 Throw 된 Exception을 catch 텍스트 파일에 "내 테스트 예외!"라는 메시지를 기록합니다.

다른 예외 유형 잡기

다른 유형의 예외에 대해 여러 가지 catch 문을 구현하여 여러 가지 방법으로 처리 할 수 ​​있습니다. 예를 들면 다음과 같습니다.

try {
    throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
    var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
    var_dump('Standard exception caught: ' . $ex->getMessage());
}

위의 예제에서 첫 번째 catch 는 실행 순서의 첫 번째 catch 와 일치하므로 사용됩니다. catch 문 순서를 바꾼 경우 Exception 포수가 먼저 실행됩니다.

비슷하게 UnexpectedValueException 을 던지면 표준 Exception 에 대한 두 번째 핸들러가 사용됩니다.

마침내

try 또는 catch 가 실행을 마친 후에 수행해야 할 작업이 필요한 경우 finally 문을 사용할 수 있습니다.

try {
    throw new Exception('Hello world');
} catch (Exception $e) {
    echo 'Uh oh! ' . $e->getMessage();
} finally {
    echo " - I'm finished now - home time!";
}

위의 예는 다음을 출력합니다.

어 오! 안녕하세요 세계 - 이제 끝났습니다 - 집으로 돌아 가자!

던지는 물건

PHP 7에서는 Throwable 인터페이스를 소개합니다.이 인터페이스는 Exception 구현은 물론 Error 입니다. 이것은 PHP 7의 예외 사이에 서비스 계약 레벨을 추가하고 사용자 정의 예외에 대한 인터페이스를 구현할 수 있도록합니다.

$handler = function(\Throwable $ex) {
    $msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
    mail('[email protected]', $ex->getMessage(), $msg);
    echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);

PHP 5 이전에는 모든 예외 클래스가 그것을 확장 했으므로 간단히 typehint Exception 을 사용할 수 있습니다.

치명적인 오류 로깅

PHP에서 치명적인 오류는 catch 할 수없는 종류의 오류입니다. 즉 치명적인 오류가 발생한 후 프로그램이 다시 시작되지 않습니다. 그러나이 오류를 기록하거나 충돌을 처리하려면 register_shutdown_function 을 사용하여 종료 처리기를 등록 할 수 있습니다.

function fatalErrorHandler() {
    // Let's get last error that was fatal.
    $error = error_get_last();
   
    // This is error-only handler for example purposes; no error means that
    // there were no error and shutdown was proper. Also ensure it will handle 
    // only fatal errors.
    if (null === $error || E_ERROR != $error['type']) {
        return;
    }

    // Log last error to a log file.
    // let's naively assume that logs are in the folder inside the app folder.
    $logFile = fopen("./app/logs/error.log", "a+");

    // Get useful info out of error.
    $type    = $error["type"];
    $file    = $error["file"];
    $line    = $error["line"];
    $message = $error["message"]

    fprintf(
        $logFile,
        "[%s] %s: %s in %s:%d\n",
        date("Y-m-d H:i:s"),
        $type,        
        $message,
        $file, 
        $line);

    fclose($logFile);       
}


register_shutdown_function('fatalErrorHandler');

참고:



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow