2009-08-06 6 views
266

일부 PHP 네이티브 함수에서 발생하는 경고를 잡아서 처리해야합니다. 특히경고를 시도 할 수 있습니까?

는 : DNS 쿼리가 실패 할 때

array dns_get_record (string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]]) 

이 경고가 발생합니다.

try/catch 경고가 예외가 아니기 때문에 작동하지 않습니다.

는 지금 2 가지 옵션이 있습니다 : 나는 모든 (?이 사실이다) 페이지에 경고 필터링을 사용하기 때문에

  1. set_error_handler

    잔인한 것 같아를;

  2. 이러한 경고가 화면에 표시되지 않도록 오류보고/표시를 조정 한 다음 반환 값을 확인하십시오. false 인 경우 hostname에 대한 레코드가 없습니다.

여기에서 가장 좋은 방법은 무엇입니까?

+1

http://stackoverflow.com/questions/136899/suppress-error-with-operator-in-php는 이와 같은 좋은 논의입니다. – Mez

+0

아래 답변이 삭제 되었습니까? 소유자 또는 누군가에 의해? – user121196

+0

참고 : http://stackoverflow.com/questions/1087365 – dreftymac

답변

293

설정 및 복원 오류 처리기

하나의 가능성은 호출하기 전에 자신의 오류 처리기를 설정하고 restore_error_handler() 나중에 이전 오류 처리기를 복원하는 것입니다.

set_error_handler(function() { /* ignore errors */ }); 
dns_get_record(); 
restore_error_handler(); 

이 아이디어를 기반으로 오류를 기록하는 재사용 가능한 오류 처리기를 작성할 수 있습니다. 예외

set_error_handler([$logger, 'onSilencedError']); 
dns_get_record(); 
restore_error_handler(); 

켜기 오류 당신은 set_error_handler()를 사용할 수 있으며, ErrorException 클래스는 예외로 모든 PHP 오류를 켭니다. 자신의 오류 핸들러는 error_reporting 설정을 무시하고 오류 처리기에 모든 오류 (공지 사항, 경고 등)을 통과하는 것입니다 사용하는 경우

set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) { // error was suppressed with the @-operator if (0 === error_reporting()) { return false; } throw new ErrorException($errstr, 0, $errno, $errfile, $errline); }); try { dns_get_record(); } catch (ErrorException $e) { // ... } 

중요한 것은

주의합니다. set_error_handler()에 두 번째 인수를 설정하여 수신하려는 오류 유형을 정의하거나 오류 처리기 내에 ... = error_reporting()을 사용하여 현재 설정에 액세스 할 수 있습니다. 경고

또 다른 가능성은 @ 연산자로 전화를 억제하고 이후 dns_get_record()의 반환 값을 확인하는 것입니다 억제

. 그러나 오류/경고가 처리되도록 트리거되고 표시되지 않도록 설정하면이에 대해 조언 할 것입니다.

+3

함수 호출 바로 전에 내 자신의 오류 처리기를 설정 한 다음 오류 검사가 완료되면 restore_error_handler를 설정하는 것이 좋습니다. – user121196

+2

많은 동시 요청이 있고 각 요청이 1.set_error_handler()를 수행하면 스레드 안전성이 보장됩니다. 2.doit 3.restore_error_handler? – user121196

+1

1. 이것이 좋은 습관이라면? 나는 정말로 모른다. 젠드 (Zend)의 친구들이이 방법을 사용하면 실제로 그렇게 나쁠 수는 없습니다. 2. 각 요청에는 자체 포함되어 있으므로 문제가 없습니다. –

4

경고를 완전히 없애려고 시도 할 수는 있지만 가능하지 않은 경우 @ (즉 @dns_get_record (...))와 통화를 시작한 다음 알아낼 수있는 정보를 사용할 수 있습니다 경고가 발생했는지 여부.

2

dns_get_record()이 실패한 경우 과 함께 경고를 표시하지 않도록 설정하고 반환 값을 확인할 수 있도록 FALSE을 반환해야합니다.

3

정상적인 해결책이 아닌 한 일반적으로 @를 사용하지 마십시오. 이 경우 레코드가 존재 하는지를 알기 위해서는 dns_check_record 함수가 먼저 사용되어야합니다.

24

@ 연산자에주의하십시오. 경고를 표시하지 않지만 치명적인 오류도 억제합니다. 누군가가 @mysql_query('...')을 작성한 시스템에서 문제를 디버깅하는 데 많은 시간을 보냈으며 문제는 mysql 지원이 PHP에로드되지 않았으며 조용한 치명적인 오류가 발생했습니다. PHP 코어에 포함 된 것들은 안전 할 것이지만 을주의해서 사용하십시오.

[email protected]:~$ php -a 
Interactive shell 

php > echo @something(); // this will just silently die... 

더 이상 출력이 없습니다. 디버깅을 잘하십시오!

[email protected]:~$ php -a 
Interactive shell 

php > echo something(); // lets try it again but don't suppress the error 
PHP Fatal error: Call to undefined function something() in php shell code on line 1 
PHP Stack trace: 
PHP 1. {main}() php shell code:0 
[email protected]:~$ 

이번에는 실패한 이유를 확인할 수 있습니다.

107

정말 그렇게 같이 E_WARNING 매개 변수를 사용하여 간단한 오류 처리기를 설정 밝혀졌다 작품 솔루션 :

나는/시도 경고를 잡을 수 있지만, 동시에 일반적인 경고를 계속하고 싶어
set_error_handler("warning_handler", E_WARNING); 
dns_get_record(...) 
restore_error_handler(); 

function warning_handler($errno, $errstr) { 
// do something 
} 
+1

매우 우아한 솔루션. UPVOTED! :) –

+3

도 익명'callable' 대신 함수 선언을 사용하는 문자열을 사용할 수 있습니다. –

+0

감사합니다.하지만 중요한 블록 다음에 오류 처리기를 제거하려면 어떻게해야합니까? –

5

/오류 로깅 (예 : /var/log/apache2/error.log); 처리기는 false을 반환해야합니다. 간략하게,

Is there a static way to throw exception in php

또는 : 다음은 "새로운 던져 ..."때문에, 문은 기본적으로 실행을 중단, 한 다음 "포장 기능에"트릭을 할 수있다, 또한 논의

function throwErrorException($errstr = null,$code = null, $errno = null, $errfile = null, $errline = null) { 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
    } 
    function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext) { 
    return false && throwErrorException($errstr, 0, $errno, $errfile, $errline); 
    # error_log("AAA"); # will never run after throw 
    /* Do execute PHP internal error handler */ 
    # return false; # will never run after throw 
    } 
    ... 
    set_error_handler('warning_handler', E_WARNING); 
    ... 
    try { 
    mkdir($path, 0777, true); 
    } catch (Exception $e) { 
    echo $e->getMessage(); 
    // ... 
    } 

편집 : 더 정밀한 점검 후, 그것이 작동하지 않습니다 밝혀 다음 "return false && throwErrorException ..."기본적으로 예외를 던지지, 그냥 오류 로그에 기록합니다; ""에서와 같이 "false &&"부분을 제거하면 예외가 발생하지만 error_log에 로그인하지 않습니다 ...이 동작을 문서화하지 않았으므로 계속 게시합니다. 다른 곳에서.

-2

직선적 인 조작 (예 : $ prop = @ ($ high/($ width - $ depth)) 일 때 경고를 표시하지 않으려면 0을 사용하고 0 경고로 나누기는 건너 뜁니다. 그러나 대부분의 경우 처리하는 것이 좋습니다.

+1

이것은 한번 사용하고 싶지 않은 한 번입니다 - 조작을 제어 할 수 있으며, 작업을 수행하기 전에 제로가 아닌지 여부를 확인할 수 있습니다. – Eborbob

0

일부 불리언 값이 반환되는지 확인하려면 간단히 조건으로 넣을 수 있습니다. 내 고유 키를 사용하여 일부 위반을 반환하는 oci_execute (...)와 함께이 문제가 발생했습니다.

ex. 
oci_parse($res, "[oracle pl/sql]"); 
if(oci_execute){ 
...do something 
} 
관련 문제