PHP의 오류 처리와 관련하여-내가 아는 한 세 가지 스타일이 있습니다.
-
die()
또는exit()
스타일 :$con = mysql_connect("localhost","root","password"); if (!$con) { die('Could not connect: ' . mysql_error()); }
-
throw Exception
스타일:if (!function_exists('curl_init')) { throw new Exception('need the CURL PHP extension. Recomplie PHP with curl'); }
-
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 개발자를 혼동 할 정도로 너무 많다고 생각하는 것은 나뿐입니까, 아니면 모두가 생각 합니까?
답변
첫 번째는 최종 사용자와 무관 한 정보를 전송하기 때문에 프로덕션 코드에서 사용해서는 안됩니다 (사용자는 “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
진술은 원하지 않더라도 데이터베이스에 입력되었을 것이며 다음에 일어날 일을 제어 할 수 없습니다.
답변
일반적으로 개발 코드에서 간단한 디버깅을 위해 첫 번째 방법을 사용합니다. 프로덕션에는 권장되지 않습니다. 가장 좋은 방법은 프로그램의 다른 부분에서 포착하여 오류 처리를 수행 할 수있는 예외를 throw하는 것입니다.
세 가지 스타일은 서로에 대한 드롭 인 대체가 아닙니다. 첫 번째는 오류가 아니라 수동으로 구문 분석 할 수 있도록 스크립트를 중지하고 디버깅 정보를 출력하는 방법 일뿐입니다. 두 번째는 그 자체로 오류가 아니지만 잡히지 않으면 오류로 변환됩니다. 마지막은 PHP 환경의 구성에 따라 처리 될 PHP 엔진에서 실제 오류를 트리거하는 것입니다 (어떤 경우에는 사용자에게 표시되고 다른 경우에는 파일에 로그인했거나 전혀 저장하지 않음).