2011-09-11 2 views
13

좋은 프로그래밍 방법을 따르고 있으며 PHP 오류를 사용자에게 표시하는 대신 파일에 기록합니다. 나는 set_error_handler()을 사용합니다.@ 오류 억제 연산자 및 set_error_handler

이제 문제가 발생했습니다. 예를 들어, 어딘가에 있습니다 :

@file_exists('/some/file/that/is/outside/openbasedir.txt'); 

그러나 오류 억제 연산자에도 불구하고 오류 메시지가 기록됩니다. 나는 그것을 원하지 않는다. 억제 된 오류가 내 오류 처리기로 전달되지 않도록하고 싶습니다.

+2

'@'을 사용하지 마십시오. 그것의 좋은 징조는, 당신이 잘못한 일을하지 않았고 그것을 고치고 싶지 않습니다. 그러나 문 자체가'@ '를 통해 "조용 해지더라도"errorhandler-callback이 호출됩니다. – KingCrunch

+0

'@ a를 사용하는 것은'isset ($ a)? $ a : '''대신에 받아 들일 수 있다고 생각합니다. 코드 가독성은 "단점"보다 우선합니다. –

+0

@Rok : 성능에 영향을 미칩니다. '@'는 에러를 감추지 만, 여전히 생성되고, 포맷팅되고, 에러 핸들러가 호출된다. 코드를 구조화하면 isset()을 많이 사용할 필요가 없다. – arnaud576875

답변

23

@ 운영자가 일시적으로 0으로, error_reporting를 설정합니다, 그래서 당신은 당신의 오류 처리기에 error_reporting를의 값을 테스트 할 수 있습니다 더 나은

if (ini_get('error_reporting') == 0) { 
    return; 
} 

또는를 error_reporting은에있는 경우에만 오류 유형 로그 :

$error_reporting = ini_get('error_reporting'); 

if (!($error_reporting & $errno)) { 
    return; 
} 

또한 자동으로 파일이나 시스템 로그에 오류를 기록 들어, log_errorserror_log 옵션을 살펴보세요.

+0

그래서 기본적으로 @ ** 임시적으로 ** error_reporting을 0으로 설정한다고 말하고 있습니까? –

+0

그래,이게 뭐야 – arnaud576875

+1

고마워, 이건 내가 ** 요청한 ** 것입니다. 그것은 완벽하게 그것을합니다. –

2

실제로는 @ 연산자의 사용을 피해야합니다. 우선, 그것은 천천히, 나는 그것까지 해로울 것이라고 생각합니다.

php.ini 파일에 당신이 대신해야 한 두 개의 라인 :

error_repoting = E_ALL | E_STRICT 
display_errors = Off 

... 또는, 당신은 다음의 index.php의 상단에, php.ini 파일에 액세스 할 수없는 경우 (또는 다른 부트 스트랩 파일)을 추가해야합니다 :

error_reporting(E_ALL | E_STRICT); 
ini_set('display_errors', 0); 
+1

내가 wounder .. 왜 내가 여기 downvote을 얻었어요 .. 철자가? –

+1

나는 downvote하지 않았지만 단지 @ 사용을 피하기 위해 말하는 것은 그 질문에 대답하지 않는다. PHP는 언젠가 예외를 던져서 잡힐 수 있습니다. 때때로 잡히지 않는 어리석은 통지를 표시합니다. 이 경우 전체 애플리케이션의 오류를 끄는 것이 합당한 해결책은 아닙니다. 그 자리에서 사일런스를 제거하는 것은 이상적이지는 않지만 (특히 오류 발생시 이미 false를 반환하는 file_exists 또는 file_get_contents와 같은 경우 특히 유용하므로주의 할 필요가 없습니다). 이상적으로 PHP는 오류를보고하는 방식에서 파손되지 않지만, 우리는이를 처리해야하기 때문에. –