php核心技术与最佳实践 --- 错误与异常
<?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接管系统已有的处理机制
php核心技术与最佳实践 --- 错误与异常的更多相关文章
- 温习《PHP 核心技术与最佳实践》这本书
再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2 ...
- PHP核心技术与最佳实践——全局浏览
难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的O ...
- php核心技术与最佳实践知识点(上)
一.基础 1.serialize:序列化一个类,只是保存了类的属性,所以还需要反序列化unserialize的时候包含该类. 2.对于将array转为object,这个转换因为没有具体的类,所以称为了 ...
- PHP核心技术与最佳实践--笔记
<?php error_reporting(E_ALL); /* php 5.3引入 延迟静态绑定 */ /* php5.4引入trait,用来实现多层继承 trait Hello{} trai ...
- PHP-PHP核心技术与最佳实践阅读
1.对象的实质: 对象就是数据, 对象本身不包含方法, 但是对象有一个"指针"指向一个类, 这个类里可以有方法 2.反射是指在PHP运行状态中, 扩展分析PHP程序, 导出或者提取 ...
- 《深入理解Java 7核心技术与最佳实践》读书笔记(2) Java语言动态性引言
Java语言是一种静态类型的编程语言.静态类型的含义是指在编译时进行类型检查.Java源代码中的每个变量的类型都要显式地进行声明.所有变量.方法的参数和方法返回值的类型在程序运行之前就必须是已知的.J ...
- java7:核心技术与最佳实践读书笔记——对象生命周期
流程:字节码文件(.class) -> 类加载 -> 类链接 -> 类初始化 -> 对象初始化 -> 对象创建 -> 对象使用 -> 对象回收 . 1.Jav ...
- 《Java核心技术与最佳实践》读书笔记
第一章 Java7新语法 1.switch中使用字符串 2.增加二进制表示0b10101010:数字字面量允许直径使用下划线12_34_90 3.一个catch字句捕获多个异常,多个异常之间用|分隔 ...
- php核心技术与最佳实践(笔记一)
1.1面向对象的型与本 类是对象的抽象组织,对象是类的具体存在. 1.1.1对象的形 <?php class Person{ public $name; public $gender; publ ...
随机推荐
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hive DDL
实验目的 了解hive DDL的基本格式 了解hive和hdfs的关系 学习hive在hdfs中的保存方式 学习一些典型常用的hiveDDL 实验原理 有关hive的安装和原理我们已经了解,这次实验我 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hive安装
实验目的 了解hive的原理和安装方式 学习使用MySQL数据库 使用hive进行基本操作 实验原理 1.Hive Hive是一个数据仓库技术,包括解释器.编译器.优化器,一次将一个sql语句装化为m ...
- Python3标准库:array数组
1. array数组 array模块定义了一个序列数据结构,看起来与list很相似,只不过所有成员都必须是相同的基本类型.支持的类型包括所有数值类型或其他固定大小的基本类型(如字节). 代码 类型 最 ...
- salt-minion启动报错No module named salt.scripts
这是当初部署saltstack时候的问题了,saltstack用的是0.17.4的版本.正当minion部署到最后时候,启动 minion端时报错ImportError: No module name ...
- 使用 Hyper-V 替代 VMware
目前我又用回了vmware,原因是,Hyper-V性能不如vmware,而且导出的虚拟机文件,再导入会出现奇怪的问题.不省心. Hyper-V是什么 Hyper-V硬件要求为Windows 10 企业 ...
- Pycharm的项目文件名是红色的原因及解决办法
今天在继续学习Python时,打开Pycharm后,发现有一个项目下的项目文件名是红色的,如下图: 刚开始我以为是我升级 Pycharm导致的,但我并没有急着去解决,因为并不会影响我执行代码等.当我修 ...
- linux 文件系统管理三部曲之二:创建文件系统
创建文件系统的含义:就是格式化一个硬盘分区,不同的格式化方式,就是创建了不同的文件系统. 格式化: 低级格式化:划分分区前执行,主要是划分硬盘的磁道等. 高级格式化:划分分区后执行,创建文件系统 创建 ...
- 调用手机摄像头并上传图片--jquery ajax
1.图片框样式与进度条样式 .alert_img_content { width: 44%; float: left; margin: 3%; border: 1px solid #ddd; back ...
- 统一操作系统 UOS 回应质疑 (独立思考)
统一操作系统 UOS 回应质疑 自从统一操作系统UOS正式版面向合作伙伴发布之后,小编就关注到网上对统一操作系统UOS众说纷纭.留意了近期网友们发表的评论: “又多了一个骗钱的国产操作系统” “从UO ...
- Oracle Solaris 10 重启后提示 Bad PBR sig
Solaris 10 安装完毕重启后提示 Bad PBR sig 在磁盘分区的时候,默认自带的 overlap 不要删除,否则启动报错. 分区时,保留overlap(默认显示总容量大小)分区.安装操作 ...