PHP 오류 처리 : die () 대 trigger_error () 대 예외 발생


119

PHP의 오류 처리와 관련하여-내가 아는 한 세 가지 스타일이 있습니다.

  1. die()또는 exit()스타일 :

    $con = mysql_connect("localhost","root","password");
    
    if (!$con) {
     die('Could not connect: ' . mysql_error());
    }
    
  2. throw Exception 스타일:

     if (!function_exists('curl_init')) {
    
          throw new Exception('need the CURL PHP extension. 
                               Recomplie PHP with curl');
        }
    
  3. trigger_error() 스타일:

    if(!is_array($config) && isset($config)) {
            trigger_error('Error: config is not an array or is not set', E_USER_ERROR);
        }
    

이제 PHP 매뉴얼에서는 세 가지 방법이 모두 사용됩니다.

  • 내가 알고 싶은 것은 어떤 스타일을 선호해야하는지, 그리고 그 이유는 무엇입니까?

  • 이 3 방울이 서로 교체되어 있으므로 서로 바꿔서 사용할 수 있습니까?

약간 OT : PHP 오류 처리 옵션이 PHP 개발자를 혼동 할 정도로 너무 많다고 생각하는 것은 나뿐입니까, 아니면 모두가 생각 합니까?


4
이것은 "스타일"이 아닙니다. 그들은 다른 언어 기능입니다. 다른 목적으로.
마리오

11
@mario : 다른 들여 쓰기 목적은 무엇입니까? 저를 계몽 해주세요 :)
CuriousMind

당신은 좋은 방법으로 질문을 던졌습니다. 물어 주셔서 감사합니다
회계사 م

답변:


86

첫 번째는 최종 사용자와 무관 한 정보를 전송하기 때문에 프로덕션 코드에서 사용해서는 안됩니다 (사용자는 "Cannot connect to database"에 대해 아무것도 할 수 없음 ).

특정 중요한 코드 포인트에서 애플리케이션 이 실패 할 수 있으며 코드가 여러 호출 수준에서 복구되기를 원하면 예외를 발생 시킵니다.

trigger_error()여러 수준의 오류 메시지를 사용하여 오류보고를 세분화 할 수 있으며 최종 사용자 (를 사용 set_error_handler()) 로부터 이러한 오류를 숨길 수 있지만 테스트 중에 여전히 표시되도록 할 수 있습니다.

또한 trigger_error()사용자 지정 오류 처리기를 사용하여 프로덕션 코드에서 억제 할 수있는 개발 중에 중요한 치명적이지 않은 메시지를 생성 할 수 있습니다. 치명적인 오류 ( E_USER_ERROR) 도 생성 할 수 있지만 복구 할 수 없습니다. 그중 하나를 트리거하면 해당 지점에서 프로그램 실행 이 중지 됩니다. 이것이 치명적인 오류의 경우 예외를 사용해야하는 이유입니다. 이렇게하면 프로그램의 흐름을 더 잘 제어 할 수 있습니다.

// Example (pseudo-code for db queries):

$db->query('START TRANSACTION');

try {
    while ($row = gather_data()) {
       $db->query('INSERT INTO `table` (`foo`,`bar`) VALUES(?,?)', ...);
    }
    $db->query('COMMIT');
} catch(Exception $e) {
    $db->query('ROLLBACK');
}

여기에서 gather_data()단순히 삐걱 거리는 ( E_USER_ERROR또는 사용 die()) 기회가 있다면, 이전 INSERT진술은 원하지 않더라도 데이터베이스에 입력되었을 것이며 다음에 일어날 일을 제어 할 수 없습니다.


2
그래서 밖으로 trigger_error()& 던지기 예외 : 내가 언제 사용해야합니까?
CuriousMind

@Gaurish 그것에 대한 추가 예제를 참조하십시오.
Linus Kleen 2011 년

2
귀하의 예제를 읽은 후 이제 예외 throw의 목적을 더 잘 이해했다고 생각합니다. 감사합니다 :)
CuriousMind 2011-08-15

1
@Pacerier 실제로 서버 구성에 따라 다릅니다. 기본적 으로 자동 커밋 하도록 시스템을 구성 수 있으므로 명시 적 . 이 의사 코드 예제는 자동 커밋하도록 구성되지 않은 서버 ( 문이 필요함) 와이를 수행하는 서버 모두를 다룹니다 . ROLLBACKCOMMIT
Linus Kleen 2013

1
@LinusKleen, 라인을 실행하면 자동 커밋이 꺼지지 query('START TRANSACTION');않습니까?
Pacerier

10

일반적으로 개발 코드에서 간단한 디버깅을 위해 첫 번째 방법을 사용합니다. 프로덕션에는 권장되지 않습니다. 가장 좋은 방법은 프로그램의 다른 부분에서 포착하여 오류 처리를 수행 할 수있는 예외를 throw하는 것입니다.

세 가지 스타일은 서로에 대한 드롭 인 대체가 아닙니다. 첫 번째는 오류가 아니라 수동으로 구문 분석 할 수 있도록 스크립트를 중지하고 디버깅 정보를 출력하는 방법 일뿐입니다. 두 번째는 그 자체로 오류가 아니지만 잡히지 않으면 오류로 변환됩니다. 마지막은 PHP 환경의 구성에 따라 처리 될 PHP 엔진에서 실제 오류를 트리거하는 것입니다 (어떤 경우에는 사용자에게 표시되고 다른 경우에는 파일에 로그인했거나 전혀 저장하지 않음).


1
예외가 발생했지만 포착되지 않으면 어떻게됩니까? 치명적인 오류가 발생할 것 같습니다. 그리고 trigger_error()같은 일이 발생합니다. 그래서 차이점은 무엇입니까?
CuriousMind

4
차이점은 예외를 포착하고 원하는 방식으로 처리 할 수 ​​있다는 것입니다.
에밀 Vikström
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.