PHP的错误和异常笔记

来源:互联网 发布:淘宝一次破损补寄条款 编辑:程序博客网 时间:2024/06/05 22:37
1>先去看PHP手册,怎么定义异常和错误的!http://php.net/manual/zh/index.php语言参考:1)Errorsbasics1.PHP错误报告,反应的是程序内部的不同错误情况。有许多不同的错误情况,这些错误可以展示或者记录到日志里。PHP产生的每个错误,都包含一个类型。可用的错误类型有:预定义的常量,作为PHP核心的一部分。注意:在 php.ini 里,可以使用 '常量名';但在PHP之外,例如:httpd.conf,必须使用 '二进制位掩码'(是不是 常量的值 ??) 来替代1 - E_ERROR2 - E_WARNING4 - E_PARSE8 - E_NOTICE16 - E_CORE_ERROR32 - E_CORE_WARNING64 - E_COMPILE_ERROR128 - E_COMPILE_WARNING256 - E_USER_ERROR512 - E_USER_WARNING1024 - E_USER_NOTICE2048 - E_STRICT4096 - E_RECOVERABLE_ERROR8192 - E_DEPRECATED16384 - E_USER_DEPRECATED30719 - E_ALL上面的值,用于建立一个 '二进制位掩码',来指定要报告的错误信息。可以使用 '按位运算符' 来 '组合' 或 '屏蔽' 这些值,来表示是展示还是屏蔽某些错误!php.ini 中,只有 '|', '~', '^', '&' 会正确解析/*注意:以前一直都没细看过,现在才明白,php手册中的错误配置,为什么要使用 '位运算符',这里都解释了! */2.handling errors with PHP如果没有设置错误处理器,PHP将会根据它的配置,来处理错误:error_reporting// 或者运行时,使用 error_reporting()。1>建议配置中设置,因为,有些错误,可能是脚本执行前就发生了。2>开发环境中,应该将 error_reporting 设置为 'E_ALL'  生产环境中,可能希望展示较少的错误,例如:E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED  但是建议都使用 E_ALL,早期就提示警告,或许可以避免后期潜在的大的问题display_errors// 控制的是错误的输出1>开发环境,开启,便于调试  生产环境,关闭,可能包含数据等私密信息log_errors// 除了可以输出错误,PHP可以将错误记录到日志中。1>生产环境,开启以记录错误!2>错误日志文件,通过 'error_log' 来配置3.user error handlersPHP默认的错误处理不满足我们的要求,我们可以自定义错误处理,通过 set_error_handlers()。PHP7错误处理1.不同于PHP5的错误报告机制,PHP7的大多数错误,作为 'Error异常' 抛出'Error异常' 可以像 'Exception异常' 一样,被 try/catch 来捕获。如果没有匹配的 catch,则调用 '异常处理函数'(set_exception_handler()注册) 进行处理。如果没有注册异常处理函数,则按照传统方式处理:PHP错误报告一个 '致命错误'(Fatal Error)/*解释下错误异常顺序:1.try / catch2.set_exception_handler()// 注意:不是上面basic的 'set_error_handler()'3.PHP 错误报告 */Error类,并非继承 'Exception',不能使用 'catch(Exception $e)',而应该使用 'catch(Error $e)'。或者,通过 'set_exception_handler()' 来捕获 Error2.Error的层次结构ThrowableErrorArithmeticErrorDivisionByZeroErrorAssertionErrorParseErrorTypeErrorException/*可以看到:'Error' 和 'Exception',都继承 'Throwable' */3.手册上,有人推荐了一篇文章,该文章介绍了 exceptions, throwables的区别,以及PHP7如何处理的。/*有时间看,看了2句,感觉确实很不错! */4.兼容PHP5.x和PHP7.x的异常和错误捕获try {} catch (Exception $e) {// PHP5.x执行} catch (Throwable $e) { // PHP7.x执行}2)异常处理1.扩展PHP内置的异常处理类2.讲述了捕获异常的结构try {} catch (Exception $e) {// PHP5.x执行} catch (Throwable $e) { // PHP7.x执行} finally {// 不管有没有捕获到异常,都会执行!PHP5.5+}catch 允许多个/*切记:当代码块中,有异常抛出,但并未被catch捕获,会转变为一个 'Fatal Error',并显示 'Uncaught Exception'除非,定义过 'set_exception_handler()'------这也是我们上面提到的异常处理的顺序 */注释:PHP内部函数,主要使用 'Error Reporting';仅有面向对象扩展,使用 '异常'。然后,通过 'ErrorException',错误可以很简单的被转换为异常!(不太懂。。。)3.手册上的评论,2个例子不错:1>当使用了 namespace(命名空间),一定不要忘记 '\' 反斜线,表示 '全局范围'(这也正是我开头犯得错误!)<?phpnamespace test;class Test {function test(){try {throw new \Exception('异常');// 添加 '\'} catch (\Exception $e) {// 添加 '\'var_dump($e->getMessage());}}}2>关于try / catch /finally 里的 return<?phpnamespace test;class Test {public function test1(){        $bar = 1;        try{            throw new \Exception('I am Wu Xiancheng.');        }catch(\Exception $e){            return $bar;            $bar--; // this line will be ignored        }finally{            $bar++;            return $bar;        }}public function test2(){        $bar = 1;        try{            throw new \Exception('I am Wu Xiancheng.');        }catch(\Exception $e){            return $bar;            $bar--; // this line will be ignored        }finally{            $bar++;        }}public function dd(){echo $this->test1();// 输出2。finally有return,try/catch返回的是finally里return的值echo $this->test2();// 输出1。finally没有return,返回的是 catch里return的值}}3>预定义异常Exception // 所有异常的基类ErrorException// 错误异常,ErrorException extends Exception4>SPL异常处理LogicExceptionBadFunctionCallExceptionBadMethodCallExceptionDomainExceptionInvalidArgumentExceptionLengthExceptionOutOfRangeExceptionRuntimeExceptionOutOfBoundsExceptionOverflowExceptionRangeExceptionUnderflowExceptionUnexpectedValueException异常和错误的几个相关函数:set_error_handler()set_exception_handler()restore_error_handler()// 恢复之前定义过的错误处理函数(上一个错误处理函数)restore_exception_handler()// 恢复之前定义过的异常处理函数(上一个异常处理函数)

原创粉丝点击