17.1 오류

사실 기본적인 오류 처리는 대부분의 프로그래밍 언어에서는 거의 다 지원하는 기능입니다.

우리가 가장 많이 접하는 오류는 문법적으로 코드가 잘못 작성되었을 때입니다. 인터프리터, 컴파일러는 잘못된 부분을 오류 메시지를 통해 개발자에게 즉시 알려 줍니다. 사실상 문법적인 오류는 PHP 스크립트 실행이 되지 않기 때문에 쉽게 문제를 해결할 수 있습니다.

PHP의 기본적인 문법 오류 처리는 매우 간단합니다. 오류 메시지, 파일 이름, 줄 번호를 출력하는 게 전부입니다. 오류가 발생하면 대부분 프로그램은 실행을 할 수 없거나, 동작을 중단합니다.

PHP는 오류 출력 제한 연산자 @를 통해 오류 메시지 출력을 제한할 수 있지만 권장하지 않는 안티 패턴입니다. 개발자는 프로그램 오류가 발생하지 않도록 최대한 노력해야 하며, 만일 오류가 발생하면 다른 대처를 통해 처리하는 것이 좋습니다.

PHP는 오류 발생 시 처리할 수 있는 간단한 몇 가지 함수를 제공합니다.



17.1.1 die() & exit()

die() 내장 함수는 exit() 함수와 유사합니다. exit() 함수는 사용자 메시지를 출력하고 현재 스크립트를 종료합니다.

|관련함수|

void exit ([ string $status ] )

예제 파일 exit-01.php

<?php

	$filename = 'abcd.txt';
	$file = fopen($filename, 'r') or exit("파일을 읽을 수 없습니다.");

?>

결과

파일을 읽을 수 없습니다.

위의 예제는 파일 읽기 예입니다. 파일을 읽기 위해서 파일 포인터를 엽니다. 만일 파일 포인터를 생성하지 못면 exit() 함수를 통해서 스크립트를 종료합니다.



17.1.2 오류 발생

trigger_error() 함수를 이용하면 사용자가 직접 오류를 발생시킬 수 있습니다.

예제 파일 error-01.php

<?php
	trigger_error("사용자 오류 발생", E_USER_ERROR);
?>

결과

[Sun May 14 17:24:40 2017] PHP Fatal error: 사용자 오류 발생 in C:\php-7.1.4-Win32-VC14-x86\jinyphp\error-01.php on line 2
[Sun May 14 17:24:40 2017] ::1:56024 [500]: /jinyphp/error-01.php - 사용자 오류 발생 in C:\php-7.1.4-Win32-VC14-x86\jinyphp\error-01.php on line 2
E_* 상수는 여러 개의 상수를 , & 비트 연산을 하여 사용할 수 있습니다.

1 : E_ERROR(integer)
치명적인 런타임 오류. 이는 메모리 할당 문제와 같이 복구할 수 없는 오류를 나타냅니다. 스크립트 실행이 중지되었습니다.

2 : E_WARNING(integer)
런타임 경고(치명적이지 않은 오류). 스크립트의 실행이 중지되지 않습니다.

4 : E_PARSE(integer)
컴파일 타임 구문 분석 오류. 구문 분석 오류는 구문 분석기에서만 생성해야 합니다.

8 : E_NOTICE(integer)
런타임 고지. 스크립트가 오류를 나타낼 수 있지만 스크립트를 실행하는 정상적인 과정에서 발생할 수 있음을 나타냅니다.

16 : E_CORE_ERROR(integer)
PHP가 처음 시작될 때 발생하는 치명적인 오류. 이것은 E_ERROR와 비슷하지만, PHP 코어에서 생성된다는 점만 다릅니다.

32 :E_CORE_WARNING(integer)
PHP가 처음 시작될 때 발생하는 경고(치명적이지 않은 오류). 이것은 E_WARNING과 비슷하지만 PHP 코어에서 생성된다는 점만 다릅니다.

64 : E_COMPILE_ERROR(integer)
치명적인 컴파일 타임 오류. 이것은 Zend Scripting Engine에 의해 생성된다는 것을 제외하고는 E_ERROR와 같습니다.

128 : E_COMPILE_WARNING(integer)
컴파일 타임 경고(치명적이지 않은 오류). 이것은 Zend Scripting Engine에 의해 생성된다는 점을 제외하고는 E_WARNING과 같습니다.

256 : E_USER_ERROR(integer)
사용자 생성 오류 메시지. PHP 함수 trigger_error ()를 사용하여 PHP 코드에서 생성된다는 점을 제외하고는 E_ERROR와 유사합니다.

512 : E_USER_WARNING(integer)
사용자 생성 경고 메시지. 이것은 PHP 함수 trigger_error ()를 사용하여 PHP 코드에서 생성된다는 점을 제외하고는 E_WARNING과 같습니다.

1024 : E_USER_NOTICE(integer)
사용자 생성 알림 메시지 PHP 함수 trigger_error ()를 사용하여 PHP 코드에서 생성된다는 점을 제외하고는 E_NOTICE와 같습니다.

2048 : E_STRICT(integer)
PHP가 코드의 변경을 제안하도록 하여 최상의 상호 운용성과 코드의 호환성을 보장하십시오.

4096 : E_RECOVERABLE_ERROR(integer)
잡을 수 있는 치명적인 오류. 아마도 위험한 오류가 발생했음을 나타내지만 엔진을 불안정한 상태로 두지 않았습니다. 사용자 정의 핸들(set_error_handler () 참조)이 오류를 catch하지 않으면 응용프로그램은 E_ERROR이므로 중단됩니다.

8192 : E_DEPRECATED(integer)
런타임 고지. 향후 버전에서 작동하지 않을 코드에 대한 경고를 받으려면 이 옵션을 활성화.

16384 : E_USER_DEPRECATED(integer)
사용자 생성 경고 메시지. PHP 함수 trigger_error ()를 사용하여 PHP 코드에서 생성된다는 점을 제외하고는 E_DEPRECATED와 같습니다.

32767 : E_ALL (integer)
PHP 5.4.0 이전의 레벨 E_STRICT를 제외하고 지원되는 모든 오류 및 경고. PHP 5.4.x에서 32767, PHP 5.3.x에서 30719, PHP 5.2.x에서 6143, 이전에 2047 코드번호.



17.1.3 커스텀 에러 핸들러

사용자 에러 핸들러는 매우 간단하게 생성할 수 있습니다. 단지 오류가 발생되었을 때 사용할 별도의 함수를 만들어 놓으면 됩니다.

이 함수는 적어도 2개의 파라미터를 가지고 있어야 합니다. 바로 오류 레벨과 메시지입니다. 매개변수는 최대 5개까지 추가할 수 있습니다. 사용자 에러 처리 함수를 set_error_handler() 함수를 통해 전역 오류 처리기로 등록할 수 있습니다.

|관련함수|

오류 처리_함수($errno, $errstr, $errfile, $errline, $errcontext)
set_error_handler(오류 처리_함수);

$errno
오류 단계를 대응합니다. PHP E_* 상수를 대응합니다.

$errstr
오류 메시지

$errfile
오류가 발생된 파일명

$errLine
오류가 발생된 명령줄

$errcontext
오류가 발생된 시점의 심볼 테이블 배열

예제 파일 error-02.php

<?php
	function userError($errno, $errstr){
		echo "사용자 오류 처리: [$errno] = $errstr <br>";
	}
	set_error_handler("userError");

	trigger_error("사용자 오류 발생", E_USER_ERROR);
?>

결과

사용자 오류 처리: [256] = 사용자 오류 발생

위의 예제는 사용자 오류 처리를 위한 예입니다. 먼저 오류 발생 시 처리할 함수를 생성합니다. 생성한 처리 함수를 set_error_handler() 함수를 통해 등록합니다. 그리고 사용자가 직접 오류를 발생하여 앞서 지정한 오류 처리 함수가 동작을 하는지 테스트할 수 있습니다.