<?php
/*php error*/
/** 异常和错误的概念不一样* 在PHP里,遇到任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,会同时抛出异常和错误)* 异常处理机制就是把"描述在正常过程中做什么事的代码"和"出了问题怎么办的代码"进行分离*/
$a = null;
try{/* $a = 5/0;*/echo $a;
}catch(exception $e){$e->getMessage();$a = -1;
}
echo $a;
// Warning: Division by zero in C:\phpStudy\PHPTutorial\WWW\phpmain\demo.php on line 10
/** 由以上运行结果可以看到,对于除零这种"异常"情况,PHP认为这是一种错误,直接触发错误,而不会自动抛出异常* 使程序进入异常流程,故最终a值并不是预想中的 -1* 也就是说,并没有进入异常分支,也没有处理异常。* php只有你主动throw后,才能捕获异常(一般情况使这样,也有一些异常可以自动捕获)* 而对于java,则认为零属于ArithmeticException ,会对其进行捕获,并对异常进行处理。* 也就是说,php通常使无法自动捕获有意义的异常的,它把所有不正常的情况都视作了错误,* 你想捕获这个异常,就得使用if...else结构,保证代码使正常的,然后判断如果除数为0,则手动抛出异常,再捕获。* 注意 : 其实php和java之间之所以由这个差距,根本原因在于,在java里,异常是唯一错误报告方式,* 而在php中却不是这样。通俗一点讲,这就是两种语言对异常和错误的界定存在分歧。什么是异常,什么是错误,* 两种语言的设计者存在不同观点。* 也就是说,php只有手动抛出异常后才能捕获异常,或者是有内建的异常机制时,会先触发错误,再捕获异常。*/
class emailException extends exception{}
class pwdException extends Exception{function __toString(){return "<div class='error'>Exception {$this->getCode()}:{$this->getMessage()}:in File:{$this->getFile()}on line:{$this->getLine()}</div>";// 改写异常结果
    }
}
function reg($reginfo = null){if(empty($reginfo) || !isset($reginfo)){throw new Exception("参数非法");}if(empty($reginfo['email'])){throw new emailException("邮件为空");}if($reginfo['pwd'] != $reginfo['repwd']){throw new pwdException("两次密码不一致");}
}
// 异常分发完了,现在对异常进行分拣并做处理
try{reg(['email' => '11' , 'pwd' => 12345678 , 'repwd' => 12345678]);// 这种情况不会捕获到异常//reg([])  触发异常且会被第三个catch块捕获。输出异常信息:参数非法reg(['email' => '' , 'pwd' => 12345678 , 'repwd' => 12345678]);// 触发异常且会被第一个catch块捕获。输出异常信息:// exception 'emailException' with message '邮件为空' in C:\phpStudy\PHPTutorial\WWW\phpmain\demo.php:46 Stack trace: #0 C:\phpStudy\PHPTutorial\WWW\phpmain\demo.php(57): reg(Array) #1 {main}/*reg(['email' => '123' , 'pwd' => 12345678 , 'repwd' => 123456789]);*/// 触发异常且会被第二个catch块捕获。输出异常信息:// Exception 0:两次密码不一致 :in File:C:\phpStudy\PHPTutorial\WWW\phpmain\demo.phpon line:49

}catch(emailException $e){echo $e;
}catch(pwdException $ep){echo $ep;
}catch(Exception $e){echo $e->getMessage();
}
// 注意 : 当函数出现异常后,就不会继续往下执行了。只会执行相应catch块的内容。
// 多次处理写catch的时候,如果有父子类关系,子类在前面,父类在后面
// 因为异常对象会从上到下对catch进行检测,检测参数列表中的对象与我们抛出的对象类型是否一样,且是否是父(catch块的对象)-子(抛出的对象)类关系;
// 如果把第三个catch块放到第一个的位置,那么后面两个catch块也永远不可能被执行
// 在这里,对表单进行异常处理,通过重写异常类、手动抛出错误的方式进行异常处理。这是一种业务异常,可以认为地把所有不符合要求的情况都视作业务异常,
// 和通常意义上的代码异常相区别
// 如果代码中只是象征性地try...catch,然后打印一个报错,最后over。这样的异常不如不用,因为其没有体现异常思想。所以合理的代码如下
/*try{可能出错的代码段if( 文件上传不成功 ) throw ( 上传异常 );if( 插入数据不成功 ) throw ( 数据库操作异常 );
}catch( 异常 ){必要的补救措施,如删除文件、删除数据库插入记录,这个处理很细致
}*//*错误*/
// php错误处理比异常的价值大得多。php错误的概念已经和异常做过比较,这里通过对oho异常的认知,给php错误下个最直观最通俗的结论:php错误就是会使
// 脚本运行不正常的情况
// php里有一套错误处理机制,可以使用set_error_handler接管php错误处理,也可以使用trigger_error函数主动抛出一个错误// 自定义错误处理函数
function customError($errno,$errstr,$errfile,$errline){echo "自定义".$errno.';'.$errstr.';'.$errfile.';'.$errline;
}
set_error_handler("customError");
1/0;  //自定义2;Division by zero;C:\phpStudy\PHPTutorial\WWW\phpmain\demo.php;96
// set_error_handler()函数会接管php内置的错误信息,你可以在同一个页面使用restore_error_handler() 取消接管
// 注意:如果使用自定义的 set_error_handler 接管php的错误信息,先前代码里的错误抑制@将失效,这种错误也会被显示
// php把很多异常看做错误,这样就可以把这些"异常"像错误一样用 set_error_handler 接管,进而主动抛出异常
// 提示,如果使用该函数,会完全绕过标准PHP错误处理函数,如果有必要,用户定义的错误处理程序必须终止 (die())脚本
trigger_error('测试'); // 定义1024;测试;C:\phpStudy\PHPTutorial\WWW\phpmain\demo.php;99// 在php中,错误和异常是两个不同的概念,这种设计从根本上导致了PHP的异常和其他语言相异。
// 以java为例,在java中,异常是错误的唯一报告方式。说到底,两者的区别就是对异常和错误的认识不同而产生的。php的异常大部分必须通过某种办法手动抛出,才能被
// 捕获到,是一种半自动化的异常处理机制
// 无论错误还是异常,都可以使用handler接管系统已有的处理机制

转载于:https://www.cnblogs.com/cl94/p/11361574.html

php核心技术与最佳实践 --- 错误与异常相关推荐

  1. php mobi_PHP核心技术与最佳实践 mobi epub

    内容简介:PHP核心技术与最佳实践,国产php web开发经典教程,php,mysql 本书一共有14章.每章节都可以单独阅读,由于部分知识点之间存在一定的衔接,故建议按先后顺序阅读. 第1章 为面向 ...

  2. PHP 核心技术与最佳实践

    货刚到,分享一波! 点击书名进行提取,密码:gpb5 书籍:<PHP 核心技术与最佳实践>

  3. kindle版java核心_深入理解java 7 核心技术与最佳实践-成富[6寸pdf mobi epub kindle版].pdf...

    深入理解java 7 核心技术与最佳实践-成富[6寸pdf mobi epub kindle版].pdf 还剩 50页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预 ...

  4. spring 2.0核心技术与最佳实践 pdf_推荐 Spring Boot 实践学习案例大全 数据缓存 和中间件 安全权限...

    概况 spring boot 实践学习案例 spring boot 初学者及核心技术巩固的最佳实践 目录 『 Spring Boot 2 快速教程 』 Spring Boot 2:WebFlux集成 ...

  5. PHP核心技术与最佳实践 读书笔记 第二章 面向对象的设计原则

    2019独角兽企业重金招聘Python工程师标准>>> 第二章 面向对象的设计原则 2.1 面向对象设计的五大原则 单一职责原则 接口隔离原则 开放-封闭原则 替换原则 依赖倒置原则 ...

  6. 读《Spring Boot 3核心技术与最佳实践》有感

    我是谁?

  7. 开放下载!《阿里云实时数仓Hologres最佳实践合集》

    简介:<阿里云原生实时数仓Hologres最佳实践合集>电子书将会首次拆解HSAP核心原理,并介绍其在阿里巴巴双11核心场景落地的最佳实践. 点击免费下载 <阿里云实时数仓Holog ...

  8. java 中的finally你知多少_Java 处理异常 9 个最佳实践,你知道几个?

    1. 在Finally中清理资源或者使用Try-With-Resource语句使用Finally Java 7的Try-With-Resource语句 2. 给出准确的异常处理信息 3. 记录你所指定 ...

  9. Elasticsearch 常见的 8 种错误及最佳实践

    题记 Elasticsearch 社区有大量关于 Elasticsearch 错误和异常的问题. 深挖这些错误背后的原因,把常见的错误积累为自己的实战经验甚至是工具,不仅可以节省我们的开发和运维时间, ...

最新文章

  1. git push 时不用每次都输入密码的方法
  2. 将应用程序11M内存占用,降至500K [转]
  3. MATLAB实战系列(十四)-如何通过YALMIP和CPLEX求解小规模(CVRP)路径调度问题(附MATLAB代码)
  4. 被程序员忽视的位运算
  5. php获取数据库不同,php – 从master数据库获取数据库凭据,然后连接到不同的数据库...
  6. cannot create employee - HR check BP_BUPA_CHECK_HR_IS_ACTIVE
  7. 基于MATLAB的Sobel边缘检测算法实现
  8. 视觉SLAM笔记(45) 搭建 VO 框架
  9. 偏差(bias)、方差(variance)和噪音(noise)
  10. Silverlight 2.5D RPG游戏技巧与特“.NET技术”效处理:(十一)AI系统
  11. poj 3928 树状数组
  12. 项目设计与范围管理(笔记)
  13. 用户故事 | 排定优先级
  14. python算方差_python 求方差python函数每日一讲 - divmod数字处理函数
  15. 服务器IIS6/IIS7、Nginx、Apache屏蔽垃圾爬虫UA禁止垃圾爬虫,屏蔽指定UA
  16. Enterprise Architect综合建模平台
  17. 原笔迹手写实现平滑和笔锋效果之:笔锋效果(三)[完结篇]
  18. 坐标转换程序:布尔沙七参数计算、投影正反算、坐标换带等
  19. 软件工程改错题例题:请将下面的非结构化程序改成结构化程序
  20. I.MX6 AW-NB177NF wifi HAL 调试修改

热门文章

  1. 最小二乘法、梯度下降法和两者区别
  2. string返回第n个字符_Programming in Lualua学习第13期 Lua字符串库
  3. rabbitmq接收不到消息_分布式消息队列:如何保证消息的可靠性传输
  4. 河北机电职业技术学院计算机分数线,河北机电职业技术学院历年分数线 2021河北机电职业技术学院录取分数线...
  5. java字符串遮蔽处理_java 字符串处理
  6. linux中sed命令用例,sed解析和用例(马哥视频笔记)
  7. Lesson 2 Gradient Desent
  8. 温室番茄一般病害的检测与严重程度评估系统(COCO Annotator 是一种基于 Web 的图像注释工具)
  9. matlab 雷达工具箱,使用Matlab的工具箱,学习“相控阵雷达技术”
  10. CS224n自然语言处理(二)——语言模型、机器翻译和CNN