PHP 언어가 단순한 이유 중 하나는 PHP의 오류 처리 메커니즘입니다. PHP 언어가 점점 더 현대화되면서 예외도 등장합니다. 또한, 이 블로그 게시물에서는 시스템의 이해를 돕기 위해 오류와 예외에 대해서만 설명합니다. , 어떤 종류의 언어든 예외가 존재하는 것은 흔한 일이므로 언어를 배우고 예외 메커니즘을 이해하는 것이 필수적입니다.
오류란 무엇입니까
PHP 언어에서 비정상적인 상황이 발생하는 경우 데이터베이스를 연결할 수 없거나 함수 매개변수 전송 오류 등) 일부 오류가 보고됩니다. E_ERROR 및 E_CORE_ERROR 오류를 제외하고 다른 오류는 프로그램을 종료하지 않습니다. 사람들이 느끼는 단순함은 오류 보고가 사람들에게 매끄럽고 편리한 작성이라는 환상을 줍니다.
예를 들어 mysql_fetch_array 쿼리의 경우 PHP 프로그램의 엄격함과 정확성이 훨씬 떨어지는 것도 바로 이 때문입니다. 네트워크 오류가 발생하고 FALSE를 반환합니다(프로그램이 종료되지 않음). 호출 프로그램이 쿼리에 일치하는 데이터가 없다고 생각하면 프로그램은 본질적으로 잘못된 것입니다.
php.ini의 error_reporting 명령을 통해 또는 error_reporting을 동적으로 호출합니다. () 함수를 사용하면 보고할 오류 유형을 선택할 수 있으며, 오류가 온라인으로 출력되는지 여부를 display_errors 명령을 통해 제어할 수 있습니다. error_log 명령은 오류를 로그에 출력하는 방법을 제어할 수 있습니다.
시스템 기능이든 사용자 정의 기능이든 내부적으로 오류가 발생하면 어떻게 호출자에게 알릴 수 있나요? 일반적으로 TRUE 또는 FALSE를 반환하는 함수로 표시됩니다.
● 호출자는 오류가 발생했다는 것만 알지만 반환된 오류 정보가 너무 적고 오류 유형에 대한 설명이 부족합니다. ● 프로그램 처리 논리와 오류 처리가 혼합되어 생성된 코드가 매우 명확하지 않습니다.
A. 작은 요령: error_get_last() 함수는 최근 오류에 대한 구체적인 이유를 반환합니다.
모범 사례:● 모든 오류를 호스팅하는 set_error_handler() 함수
● Trigger_error() 함수는 사용자 정의 오류를 트리거할 수 있으며 함수의 return 문을 대체하는 데 사용됩니다. ● 모든 오류를 로그에 출력하고 오류 유형을 정의합니다.
● 사용자에게 더 친숙한 방법으로 오류를 반환하는 등 오류를 표시합니다.
● display_errors 명령은 프로덕션 환경에서는 꺼야 하고 개발 환경에서는 켜야 합니다
오래된 PHP 프레임워크 Codeigniter는 오류를 처리하는 방식을 통해 배울 수 있습니다
function _error_handler($severity, $message, $filepath, $line) { $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); //输出500错误HTTP状态码 if ($is_error) { set_status_header(500); } //对于不需要处理的错误则直接中断 if (($severity & error_reporting()) !== $severity) { return; } //将所有的错误记录到日志中 $_error =& load_class('Exceptions', 'core'); $_error->log_exception($severity, $message, $filepath, $line); //友好的输出所有错误 if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))){ $_error->show_php_error($severity, $message, $filepath, $line); } //假如致命错误则直接退出 if ($is_error) { exit(1); } } set_error_handler('_error_handler');예외란 무엇입니까
Exception도 오류입니다. 다음과 같은 특징이 있습니다.
● 예외는 사용자 정의할 수 있고 SPL은 다양한 유형의 예외를 제공하며 확장도 가능합니다.● 예외에 대한 가장 일반적인 작업은 캡처이므로 개발 운영자는 이를 기반으로 후속 처리를 수행할 수 있습니다. 예를 들어, 예외 상황에 따라 사용자에게 친숙한 프롬프트를 반환하거나 계속해서 예외를 발생시키고 예외가 발견되지 않으면 프로그램이 직접 종료됩니다. .
● 예외에 대한 또 다른 조치는 함수를 통해 비즈니스 로직을 작성하고 예상치 못한 상황이 발생하면 예외를 직접 발생시키는 것입니다. 프로그램이 이를 포착하지 못하면 코드 실행이 직접 종료됩니다
● PHP에서 예외를 포착할 수 없으면 시스템 오류 로그에 치명적인 오류로 기록됩니다
직관적인 코드를 통해 설명합니다:
function inverse($x) { if ($x < 10) { throw new Exception('x<10'); } elseif ($x >= 10 and $x < 100) { throw new LogicException('x>=10 and x<100'); } return $x; } try { echo inverse(2)."\n"; } catch (LogicException $e) { echo 'Caught LogicException: ', $e->getMessage(), "\n"; } catch (Exception $e) { echo 'Caught Exception: ', $e->getMessage(), "\n"; throw $e; }The 최고의 예외 연습
● 예외는 코드를 더 명확하게 만들고 개발자가 비즈니스 로직 작성에 집중할 수 있도록 해줍니다.
● 확장 가능한 예외를 작성하는 것은 매우 기술적인 일입니다.
● 예외 포착만으로는 부족하지 않나요?
PHP7의 예외PHP7에서는 오류를 대체하기 위해 예외를 사용하도록 권장하지만 오류 처리 메커니즘을 뒤집는 것은 불가능합니다. 모두 호환되어야 하므로 천천히 전환하면 됩니다.
하지만 예외는 유연한 방법을 통해 균일하게 사용할 수 있습니다.
● 오류 예외
PHP는 오류 예외를 정의합니다. juxtaposed,
엄격 모드를 켜면 PHP7에서 오류 예외로 인해 많은 오류가 발생합니다. 이런 식으로 예외를 균일하게 사용할 수 있습니다.
declare (strict_types = 1); function add(int $a, int $b) { return $a + $b; } try { echo add("3", "4"); } catch (TypeError $e) { //TypeError继承自Error echo $e->getMessage(); }
● ErrorException
ErrorException은 Exception을 상속합니다.
우리는 전달할 수 있습니다. set_error_handler() 이 함수는 모든 오류를 ErrorException으로 변환합니다. 이렇게 하면 예외를 즐겁고 균일하게 사용할 수 있습니다.
위 내용은 PHP의 오류와 예외를 체계적으로 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!