在学习中,越学习越觉得自己基础薄弱。

在平常工作中,对于某些错误处理感觉不知道怎么下手,于是决定重新再整理一下。

强烈推荐这篇文章,真的感觉学习到了很多。

部分引用::再谈PHP错误与异常处理

--

1、在 PHP 中,什么是错误和异常处理?

在我的理解中。

  只要是不符合程序预期的执行计划,都是异常。

  属于编写的问题,导致编译器无法通过编译。或者其他。是不能由 try-cache 捕捉的。

我的理解真的很浅,上面文章对这方面讲解的很详细。

--

2、错误的级别

这个问题引出了我今天为什么要重新学习错误和异常处理的原因。

bool trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] )

产生一个用户级别的 error/warning/notice 信息

这个函数引出了错误级别的概念,我当时在想,什么是用户级别的错误?

这里引出了错误级别的分类,先看看有哪些错误级别吧

Fatal Error:致命错误(脚本终止运行)
E_ERROR // 致命的运行错误,错误无法恢复,暂停执行脚本
E_CORE_ERROR // PHP启动时初始化过程中的致命错误
E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
E_USER_ERROR // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR) Parse Error:编译时解析错误,语法错误(脚本终止运行)
E_PARSE //编译时的语法解析错误 Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
E_WARNING // 运行时警告 (非致命错误)。
E_CORE_WARNING // PHP初始化启动过程中发生的警告 (非致命错误) 。
E_COMPILE_WARNING // 编译警告
E_USER_WARNING // 用户产生的警告信息 Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
E_NOTICE // 运行时通知。表示脚本遇到可能会表现为错误的情况.
E_USER_NOTICE // 用户产生的通知信息。

这些报错信息均会在 log 中体现,这也就体现了我上面的问题。

什么是用户级别的报错信息。

就是用户自定义了一个致命错误。

知道这些的话,我们也就可以继续往下走了。

--

3、PHP异常处理函数

这里也是学习和记录。

一:set_error_handler()

  看一下官方对于他的解释:设置用户自定义的错误处理函数

  也很好理解吧,就是定义一个在发生错误处理的函数

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

  但是注意:该函数只能捕获系统产生的一些Warning、Notice级别的错误。

二:register_shutdown_function()

  看一下官方对于他的解释:  注册一个会在php中止时执行的函数

  这个也从字面就可以理解,就是在 php 中止时调用的函数

void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )

  但是注意,在测试时,单单一个页面的 PHP 是不会触发错误的,必须通过 include/require 引入才能生效。

  具体还是看大神的文章:问什么不能触发,为什么框架中是可以的?

三:set_exception_handler()

  看一下官方对于他的解释:设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。

callable set_exception_handler ( callable $exception_handler )

--

4、自定义处理函数和异常嵌套

在平常使用中,这个可能使用最多的了,因为之前在使用框架时候,这部分已经进行封装,但是我们希望在对应时候有对应的处理机制,就会一直的扩展下去。

一:自定义异常处理

  在复杂的系统中,我们往往需要自己捕获我们需要特殊处理的异常,这些异常可能是特殊情况下抛出的。所以我们就自己定义一个异常捕获类,该类必须是 exception 类的一个扩展,该类继承了 PHP 的 exception 类的所有属性,并且我们可以添加自定义的函数,使用的时候其实和之前的一样,大致写法如下:

<?php

class go extends Exception
{
public function M()
{
return 'Error line ' . $this->getLine().' in ' . $this->getFile()
.': <b>' . $this->getMessage();
}
} try {
throw new go($age);
} catch (go $e) {
echo $e->M(); }

二:自定义异常处理

这里借用大佬的一部分代码,总的来说,就是可以嵌套多个 try-cache 在抓到错误时时,分层传递异常。

注意:在有多个异常时,会优先处理第一个异常

<?php

    class zyfException extends Exception
{
public function errorzyfMessage()
{
return 'Error line ' . $this->getLine().' in ' . $this->getFile()
.': <b>' . $this->getMessage() . '</b> Must in (0 - 60)';
}
} $age = 1000; try {
$age = intval($age);
// if($age > 60) {
throw new zyfException($age);
// } // if ($age <= 0) {
throw new Exception($age . ' must > 0');
// } } catch (zyfException $e) {
echo $e->errorzyfMessage(); } catch(Exception $e) {
echo $e->getMessage();
}
?>

--

关于异常和错误今天就写到着了,感觉真的,大佬写的很好,很受益。

同时感到了自己的不明白,更应该多学习。

2018/05/02 PHP 之错误与异常处理的更多相关文章

  1. 2018/05/02 每日一学Linux 之 .bash_profile和.bashrc的区别

    最近一直在学习其他,导致博客就疏忽了,很不好(其实就是自己懒了......). -- 为什么要使用 .bash_profile和.bashrc ? 在平常的使用中,有些文件夹或者命令很长,在执行时需要 ...

  2. PHP错误以及异常处理

    以前一直觉得php的异常处理没有什么,现在才发现这个还真是门学问,于是狠下心来好好研究了一下,写一篇文章,也作备忘吧. 1. php错误 无论是什么语言编程,都会有如下三种错误,当然php也不例外. ...

  3. Yii中的错误及异常处理

    Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...

  4. 再谈PHP错误与异常处理

    博客好久没有更新了,实在惭愧,最近在忙人生大事,哈哈!这段时间没有看什么新的东西,结合项目中遇到的PHP异常处理问题,我又重新梳理了之前模糊的概念,希望对大家理解PHP异常处理有所帮助. 请一定要注意 ...

  5. Golang错误和异常处理的正确姿势

    Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...

  6. 2018.12.02 Socket编程之初识Socket

    Socket编程主要分为TCP/UDP/SCTP三种,每一种都有各自的优点,所以会根据实际情况决定选用何种Socket,今天开始我将会逐步学习Socket编程,并将学习过程记录于此. 今天学习的是TC ...

  7. Microsoft Artificial Intelligence Conference(2018.05.21)

    时间:2018.05.21地点:北京嘉丽大酒店

  8. 【PHP】解析PHP中的错误和异常处理

    目录结构: contents structure [-] 错误级别 自定义处理器 设置异常日志 自定义异常类 在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助. 1.错误级别 PHP ...

  9. ThinkPHP5.0源码学习之注册错误和异常处理机制

    在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...

随机推荐

  1. HyperLogLog

    数据量一大,连统计基数也成了一个麻烦事.在使用kylin的时候,遇到对度量值进行基数统计,使用的是Hyperloglog算法,占用内存小,误差小,实乃不错的方法,但查阅网上的资料与内容,感觉未能理解的 ...

  2. Excel中substitute替换函数的使用方法

    问题现象:在Excel中,对几千条数据按照时间顺序排序,但总是有部分数据不参与排序,单纯用单元格调整不起任何作用. 解决办法: 数据排列问题最重要的是数据格式的一致性.解决这个问题,建议按如下步骤: ...

  3. Qt库版查询

    1 背景 在为嵌入式产品开发Qt应用时,开发所使用的Qt库要和嵌入式系统所支持的Qt库版本一致,否则开发的App无法正确运行.那么,如何查询一个嵌入式系统中所安装Qt库的版本呢?下面将进行一些总结. ...

  4. json 报错'xxx is not JSON serializable'的处理方法

    场景: 报错: 原因: json不能对np.int64或者np.float64等类型进行序列化,可以通过自定义serializer或者直接类型转换来解决. 解决方法: 显式的把 date 转换成 in ...

  5. Spark学习笔记——房屋价格预测

    先翻译了一下给的房屋数据的特征,这里定义了一个case class,方便理解每个特征的含义, Kaggle的房价数据集使用的是Ames Housing dataset,是美国爱荷华州的艾姆斯镇2006 ...

  6. 音视频处理ffmpeg使用

    参考资料: [url]http://blog.163.com/prosen@yeah/blog/static/12251328720099101378975/ http://ffmpeg.org/ff ...

  7. [UFLDL] *Sparse Representation

    Deep learning:二十九(Sparse coding练习) Deep learning:二十八(使用BP算法思想求解Sparse coding中矩阵范数导数) Deep learning:二 ...

  8. 6、二、App Components(应用程序组件):1、Intents and Intent Filters(意图和意图过滤器)

    1.Intents and Intent Filters(意图和意图过滤器) 1.0.Intents and Intent Filters(意图和意图过滤器) An Intent is a messa ...

  9. 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V2 -- 对象传输

    网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- 使用序列化和反序列化在网络上传输对象:需要实现 java.io.Serializable 接口 只能传输( ByteBuf ...

  10. Markdown 链接

    如下,方括号显示说明,圆括号内显示网址, Markdown 会自动把它转成链接 [我是百度](https://www.baidu.com/) [我是淘宝](https://www.taobao.com ...