php为什么这样写还是会报错呢?

每条数据里面有些是没有page_info字段的 所以有时会报Undefined index: page_info的错误 但是我下面这样写为什么不会跳过错误还是报错呢?


foreach($res['data']['cards'] as $k=>$v){
            try{
                echo $v['mblog']['page_info']['media_info']['text'].'<br />';
            }catch(Exception $e){
                continue;
            }
}
阅读 2.7k
5 个回答
PHP有异常错误(这个也算PHP设计上的一个缺陷,不过PHP 7已经改变了大多数错误的报告方式)

异常处理和其他语言类似(JAVA、JavaScript、c#...)

PHP 错误处理

PHP reports errors in response to a number of internal error conditions. These may be used to signal a number of different conditions, and can be displayed and/or logged as required.

Every error that PHP generates includes a type. A list of these types is available, along with a short description of their behaviour and how they can be caused.

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

https://www.php.net/manual/zh...

控制异常上报规则

  1. php.ini修改error_reporting=xxx
  2. 在运行时调用error_reporting(xxx)

PS: 针对你的情况可以使用isset??运算符

你不会在try-catch块中捕获它,因为“undefined index” 是 E_NOTICE error, 不是 exception, 可以用set_error_handler():

    <?php
    function my_handle(){}
    set_error_handler("my_handle");
    echo $foo["bar"];
    ?>

您可以在my_handle()函数中做任何您想做的事情,或者只是将其保留为空以使通知静音,尽管不建议这样做。普通处理程序应如下所示:

function myErrorHandler($errno, $errstr, $errfile, $errline)

如果只是想当这个key不存在 忽略 继续执行的话。直接

foreach($res['data']['cards'] as $k=>$v){
            if isset($v['mblog']['page_info']){
                echo $v['mblog']['page_info']['media_info']['text'].'<br />';
            }
}
echo @$v['mblog']['page_info']['media_info']['text'].'<br />';

事实上, 这应该属于php的bug.

作为弱类型的结构数组, 不应该去判断某个key存不存在.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题