代码之家  ›  专栏  ›  技术社区  ›  Lizard

使用PHP警告尝试catch

  •  3
  • Lizard  · 技术社区  · 14 年前

    是否可以执行某种将捕获警告的Try-Catch?

    例如

    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时执行一些操作,但我希望能够捕获确切的警告消息,然后对其执行一些操作。

    这有可能吗?

    谢谢

    4 回复  |  直到 12 年前
        1
  •  7
  •   Artefacto    14 年前

    你应该使用 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通知。

        2
  •  6
  •   Ehsan    14 年前

    可能你在找这个

    <?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

        3
  •  0
  •   2ndkauboy    14 年前

    你可能会使用 custom error handler 但我不完全确定你得到的警告是否能得到处理。某些错误或警告将始终使用默认错误处理程序。但是试试看。

        4
  •  0
  •   Robert    12 年前

    我刚在 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 (!@copy('no_file', 'some_file')) {
      echo $php_errormsg, "\n";
    }