2010-07-23 86 views
3

是否有可能做某種試圖捕捉警告?試着抓住PHP的警告

例如

if (!$dom->loadHTMLFile($url)) { 
    //if cant load file handle error my way 
} 

對於$url我使用我越來越

Warning (2): DOMDocument::loadHTMLFile(MYURL) [domdocument.loadhtmlfile]: failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden 
[APP\controllers\import_controller.php, line 62] 

Warning (2): DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: I/O warning : failed to load external entity "hMYURL" [APP\controllers\import_controller.php, line 62] 

我可以取消錯誤,並做一些事情,如果調用返回false,但我希望能夠捕捉精確的警告信息然後用它做點什麼。

這可能嗎?

感謝

+1

可能重複[try和catch PHP的警告(http://stackoverflow.com/questions/1241728/try-and-catch-php -警告) – Sarfraz 2010-07-23 09:32:00

回答

7

你應該使用libxml_use_internal_errors這一點。

這個例子是改編自手冊:

libxml_use_internal_errors(true); 
$doc = new DOMDocument(); 
$res = $doc->loadHTMLFile($url); //this may fail and return FALSE! 
foreach (libxml_get_errors() as $error) { 
    // handle errors here 
} 
libxml_clear_errors(); 

沒有PHP通知將在這裏發出。

0

你也許能夠使用custom error handler,但我不能完全肯定,如果你得到了警告,可以處理。一些錯誤或警告將始終使用默認錯誤處理程序。但試試看吧。

6

也許你正在尋找這個

<?php 
// error handler function 
function myErrorHandler($errno, $errstr, $errfile, $errline) 
{ 
    switch ($errno) { 
    case E_USER_ERROR: 
     echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; 
     echo " Fatal error on line $errline in file $errfile"; 
     echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
     echo "Aborting...<br />\n"; 
     exit(1); 
     break; 

    case E_USER_WARNING: 
     echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; 
     break; 

    case E_USER_NOTICE: 
     echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; 
     break; 

    default: 
     echo "Unknown error type: [$errno] $errstr<br />\n"; 
     break; 
    } 

    /* Don't execute PHP internal error handler */ 
    return true; 
} 

// function to test the error handling 
function scale_by_log($vect, $scale) 
{ 
    if (!is_numeric($scale) || $scale <= 0) { 
     trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR); 
    } 

    if (!is_array($vect)) { 
     trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING); 
     return null; 
    } 

    $temp = array(); 
    foreach($vect as $pos => $value) { 
     if (!is_numeric($value)) { 
      trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE); 
      $value = 0; 
     } 
     $temp[$pos] = log($scale) * $value; 
    } 

    return $temp; 
} 

// set to the user defined error handler 
$old_error_handler = set_error_handler("myErrorHandler"); 

// trigger some errors, first define a mixed array with a non-numeric item 
echo "vector a\n"; 
$a = array(2, 3, "foo", 5.5, 43.3, 21.11); 
print_r($a); 

// now generate second array 
echo "----\nvector b - a notice (b = log(PI) * a)\n"; 
/* Value at position $pos is not a number, using 0 (zero) */ 
$b = scale_by_log($a, M_PI); 
print_r($b); 

// this is trouble, we pass a string instead of an array 
echo "----\nvector c - a warning\n"; 
/* Incorrect input vector, array of values expected */ 
$c = scale_by_log("not array", 2.3); 
var_dump($c); // NULL 

// this is a critical error, log of zero or negative number is undefined 
echo "----\nvector d - fatal error\n"; 
/* log(x) for x <= 0 is undefined, you used: scale = $scale" */ 
$d = scale_by_log($a, -2.5); 
var_dump($d); // Never reached 
?> 

這將使此輸出:

vector a 
Array 
(
    [0] => 2 
    [1] => 3 
    [2] => foo 
    [3] => 5.5 
    [4] => 43.3 
    [5] => 21.11 
) 
---- 
vector b - a notice (b = log(PI) * a) 
<b>My NOTICE</b> [1024] Value at position 2 is not a number, using 0 (zero)<br /> 
Array 
(
    [0] => 2.2894597716988 
    [1] => 3.4341896575482 
    [2] => 0 
    [3] => 6.2960143721717 
    [4] => 49.566804057279 
    [5] => 24.165247890281 
) 
---- 
vector c - a warning 
<b>My WARNING</b> [512] Incorrect input vector, array of values expected<br /> 
NULL 
---- 
vector d - fatal error 
<b>My ERROR</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br /> 
    Fatal error on line 35 in file trigger_error.php, PHP 5.2.1 (FreeBSD)<br /> 
Aborting...<br /> 

Read more

0

我只是找到了一個非常有吸引力的解決方案在http://bytes.com/topic/php/answers/6296-catch-warnings

首先告訴PHP來跟蹤所有錯誤:(含警告)

ini_set('track_errors', '1'); 

這讓所有的錯誤信息到變量$php_errormsg(見http://www.php.net/manual/en/errorfunc.configuration.php#ini.track-errors )。

然後你就可以趕上錯誤和警告是這樣的:

if ([email protected]('no_file', 'some_file')) { 
    echo $php_errormsg, "\n"; 
}