DEV WIKI
백엔드 · 오류·증상

fatal error

PHP 7에서 Exception 타입 선언을 사용한 set_exception_handler() 처리기가 Error 객체를 받으면 fatal error가 발생합니다.

빠른 답변

우선 확인할 원인
PHP 7에서 set_exception_handler()에 등록한 처리기의 매개변수를 Exception으로 타입 선언한 경우 Error 객체가 발생하면 fatal error가 발생하므로, PHP 5·7 호환 코드에서는 해당 타입 선언을 제거하고 PHP 7 전용 코드에서는 Throwable로 바꿉니다.
먼저 확인할 항목
`set_exception_handler()`에 등록한 처리기의 매개변수가 `Exception`으로 타입 선언되어 있는지 확인합니다.
적용 범위
현재 증상과 본문에 적은 관찰 조건이 함께 확인된 경우
출처 확인일
2026-07-30
최종 검토
2026-07-27
수정일
2026-07-27
관련 기술
오류·수정 제보 (새 창에서 열림)

현재 증상

  • PHP 치명적 오류

먼저 확인할 항목

`set_exception_handler()`에 등록한 처리기의 매개변수가 `Exception`으로 타입 선언되어 있는지 확인합니다.

`Error` 객체가 발생할 때 `fatal error`가 발생하는지 확인합니다.

피해야 할 조치

주의

  • 변경 전 현재 처리기 선언과 변경 대상을 기록합니다.
  • 가능한 경우 변경 전 코드를 백업하거나 내보냅니다.
  • 한 번에 한 항목만 변경합니다.
  • 장애 또는 오류가 발생하면 기록한 이전 값으로 복구합니다.

환경별 원인과 조치

증상

PHP 7에서 set_exception_handler()에 등록한 예외 처리기의 매개변수가 Exception으로 타입 선언되어 있고 Error 객체가 발생하면 fatal error가 발생합니다.

확인

  1. set_exception_handler()에 등록한 처리기 함수를 확인합니다.
  2. 처리기 매개변수가 Exception으로 타입 선언되어 있는지 확인합니다.
  3. Error 객체가 발생한 경우 fatal error가 발생하는지 확인합니다.

처리기 매개변수에 Exception 타입 선언이 있고 Error 객체가 발생했을 때 fatal error가 발생하면 이 문제에 해당합니다.

복구

PHP 5와 PHP 7을 함께 지원해야 하면 처리기 매개변수의 타입 선언을 제거합니다.

PHP 7 전용 코드이면 처리기 매개변수의 Exception 타입 선언을 Throwable로 바꿉니다.

주의사항

  • 변경 전 현재 처리기 선언과 변경 대상을 기록합니다.
  • 가능한 경우 변경 전 코드를 백업하거나 내보냅니다.
  • 한 번에 한 항목만 변경합니다.
  • 장애 또는 오류가 발생하면 기록한 이전 값으로 복구합니다.

관찰값 기록

문제가 발생한 URL 또는 화면, 표시 시각, 운영 환경과 최근 변경 사항을 먼저 기록합니다. 화면이나 로그에 오류 문구가 일부만 보이면 앞뒤 문장을 보존하고 비밀번호·토큰·쿠키·개인정보는 가립니다.

다음 항목을 실제 값과 함께 확인합니다.

  1. set_exception_handler()에 등록한 처리기의 매개변수가 Exception으로 타입 선언되어 있는지 확인합니다.
  2. Error 객체가 발생할 때 fatal error가 발생하는지 확인합니다.

판정 기준

오류 문구가 일치해도 같은 원인이 확정되는 것은 아닙니다. 웹서버·런타임·운영체제·플랫폼과 최근 변경 사항을 비교하고, 기대한 관찰값이 나오지 않으면 다음 단계로 넘어가지 않습니다. 이 문서는 출처가 확인한 범위만 설명하며, 범위를 벗어난 원인과 조치는 단정하지 않습니다.

안전한 다음 확인

설정·권한·데이터를 변경하기 전에 백업과 되돌리기 방법을 기록합니다. 운영 환경의 방화벽 전체 해제, 인증서 검증 우회, 데이터 삭제, 비밀값 공개를 기본 조치로 사용하지 않습니다. 확인 결과가 문서의 조건과 다르면 관련 Platform·Component 문서와 공식 출처를 먼저 확인합니다.

원인 분포

[Observation] 관측된 사례 기준으로, 세 사례 모두 예외 처리 콜백이 Exception만 받을 수 있도록 선언된 상태에서 Error 객체가 전달되며 TypeError 또는 치명적 오류가 발생했습니다.

[Observation] 사례 1과 사례 3은 PHP 애플리케이션의 예외 처리 콜백에서 이 문제가 나타났고, 사례 2는 CodeIgniter 3.0.0의 예외 처리기에서 나타났습니다.

[Hypothesis] 기존 코드가 PHP 7의 Throwable 계층을 고려하지 않은 것이 공통적인 호환성 문제로 보입니다. 실제 발생 빈도로 해석해서는 안 됩니다.

오진 함정

[Observation] 오류 메시지에 ExceptionError가 함께 나타나더라도, 사례 원문에서는 애플리케이션 내부의 일반적인 예외 발생보다 콜백 매개변수 타입 선언이 직접적인 실패 지점으로 제시됩니다.

[Observation] ErrorException의 하위 타입이 아니므로 Exception 타입 매개변수로 받을 수 없으며, 두 타입을 모두 처리하려면 Throwable을 사용해야 합니다.

환경 매트릭스

환경증상사례에서 확인된 수정
PHP 7.0.3 애플리케이션set_exception_handler() 콜백이 Error 처리 중 TypeError 발생콜백이 Throwable을 처리하도록 변경
PHP 7 + CodeIgniter 3.0.0예외 처리기의 Exception 타입 선언으로 치명적 오류 발생CodeIgniter 3.0.2 이후로 업데이트하거나 호환 코드에서 타입 선언 제거
오래된 PHP 애플리케이션ReportException(Exception $e)Error가 전달되어 치명적 TypeError 발생매개변수 타입을 Throwable로 변경

진단 순서

  1. [Observation] PHP 버전과 프레임워크 버전을 확인합니다. 사례에서는 PHP 7 업그레이드와 CodeIgniter 3.0.0이 관련 환경으로 나타났습니다.
  2. [Observation] set_exception_handler() 또는 사용자 정의 예외 처리 콜백의 매개변수 타입이 Exception으로 제한되어 있는지 확인합니다.
  3. [Observation] 실제 전달된 객체가 Exception인지 Error인지 확인합니다. PHP 7에서는 두 타입 모두 Throwable을 구현합니다.
  4. [Observation] 사례에서 확인된 수정 범위에 따라 콜백 타입을 Throwable로 변경하거나, CodeIgniter를 3.0.2 이후 버전으로 업데이트하거나 호환 코드의 타입 선언을 제거합니다.
  5. [Observation] 수정 후 애플리케이션 재동작과 fatal error 소멸 여부를 확인합니다. 사례 3에서는 수정 후 두 결과가 확인됐습니다.

참고 자료

PHP: Backward incompatible changes - Manual (새 창에서 열림)

PHP · 공식 자료 · 확인 범위: PHP 7에서는 많은 fatal 및 recoverable fatal error가 Error 클래스를 상속하는 예외로 전환되었습니다., set_exception_handler()에 등록한 처리기가 Exception 타입 선언을 사용하면 Error 객체가 발생할 때 fatal error가 발생합니다., PHP 5와 PHP 7을 함께 지원해야 하면 처리기에서 타입 선언을 제거할 수 있습니다., PHP 7 전용 코드에서는 Exception 타입 선언을 Throwable로 바꿀 수 있습니다. · 확인일: 2026-07-24

Stack Overflow · 운영 사례 (새 창에서 열림)

확인 범위: PHP 7.0.3 업그레이드 후 set_exception_handler() 콜백이 Exception만 받도록 선언되어 Error 객체 처리 중 TypeError가 발생했습니다., PHP 7에서는 Error와 Exception이 모두 Throwable을 구현합니다. · 확인일: 2026-07-30

Stack Overflow · 운영 사례 (새 창에서 열림)

확인 범위: PHP 7에서 CodeIgniter 3.0.0의 예외 처리기가 Exception 타입 선언 때문에 치명적 오류를 냈습니다., CodeIgniter 3.0.2 이후 버전으로 업데이트하거나 호환 코드에서 타입 선언을 제거하는 방법으로 수정했습니다. · 확인일: 2026-07-30

Stack Overflow · 운영 사례 (새 창에서 열림)

확인 범위: 오래된 PHP 애플리케이션의 ReportException(Exception $e)가 Error 객체를 받아 치명적 TypeError를 표시했습니다., 매개변수 타입을 Throwable로 변경한 뒤 애플리케이션이 다시 동작했고 fatal error가 사라졌습니다. · 확인일: 2026-07-30