跟着百度学PHP[11]-PHP当中的异常处理
首先要说一下常见的三种错误:
1.语法错误
2.运行错误
3.逻辑错误
00x1 错误报告及错误级别
PHP的错误分为三个等级
1.注意(notice) 没有变量a
2.警告(warning) 没有给函数传值
3.致命的错误(fatal error) 函数写错
错误的报告级别可以在PHP.ini当中修改。
在PHP.ini当中找到错误报告“error_reporting = E_ALL ” 这个的意思是将所有的错误都提示出来。
ps:~是除了的意思。&是和的意思。
error_reporting = E_warning & E_fatal error (仅提示警告warning和致命错误fatal error)
error_reporting = E_ALL ~ E_notice (提示全部,除了注意notice)
00x2 自定义PHP报告错误处理方式
什么叫做自定义报告错误的处理方式呢?
也就是
( ! ) Fatal error: Call to undefined function geaaattype() in D:\wamp\www\dnf.php on line 2 |
---|
按照我们意图来写。
很显然这个错误是PHP自己系统已经自带的。那么我们需要告诉PHP我们不要你自身的这个错误函数,我要自己创建一个。
set_error_handler("myerrorfun");(handler音译:处理)这个语句就是告诉PHP我要自己创建一个myerrorfun的错误信息。然后你需要定义一下这个函数。代码大概如下所示:
- <?php
- set_error_handler("myerrorfun");#注册一个myerrorfun的错误函数
- function myerrorfun($type,$mess,$file,$line){#这个函数有四个参数,分别是错误类型,错误信息,错误文件,错误行
- }
- ?>
00x3 设置错误日志
在php.ini当中有显示错误:display_errors = On 默认是开着的,我们可以off关闭它。apache的日志文件:log_errors = On
如果想要把apache的日志文件写入windows的系统日志里面,就可以将:error_log = syslog开启。默认是被注释掉的。分号是注释。
00x4 PHP异常处理(try catch)
如果有trow new exception的话那么就是有异常。
- <?php
- echo "早上起床<br />";
- try{
- echo "开车上班。<br />";
- throw new Exception("车子爆胎。<br />");//抛出异常,有异常第六行的echo不进行执行直接执行catch
- echo "路况很好。";
- }catch(Exception $e){
- echo $e->getmessage();//其实这里的$e就是异常。Exception是系统已经定义好了的了一个类,调用其getmessage方法即可。
- echo "换上备胎,继续开车去上班。<br />";
- }
- ?>
本来是按照顺序,1-2-3-4-5-6....这样执行的,但是当程序执行到throw new Exception(抛出新的异常)的时候就会直接跳过第六行去执行第8行的,而会被赋值给$e,Exception其实是一个类,系统定义好的一个类,可以通过调用Getmessage来获取第5行里面的“车子爆胎”这个数据。倘若没有throw new Exception的话,就会直接向下执行,说路况很好,进而不执行第9行的代码。
那么问题来了,怎么知道系统发生错误了呢???
思路:可以注册一个错误函数(00x2有讲到),然后使用if判断错误的类型。
案例:
- <?php
- set_error_handler("myerrorfun");
- function myerrorfun($type,$mess,$file,$line){
- if ($type == E_WARNING) {#如果错误类型出现了严重,那么抛出异常(也就是throw new Exception)
- throw new Exception("出现了严重的错误。{$mess},{$file},{$line}");
- }
- }
- function say($language){#定义一个say函数
- echo $language;#直接输出这个函数。
- }
- say();#故意错误的使用函数。
- ?>
结果爆出如下错误:
( ! ) Fatal error: Uncaught exception 'Exception' with message '出现了严重的错误。Missing argument 1 for say(), called in D:\wamp\www\test.php on line 11 and defined,D:\wamp\www\test.php,8' in D:\wamp\www\test.php on line 5 | ||||
---|---|---|---|---|
( ! ) Exception: 出现了严重的错误。Missing argument 1 for say(), called in D:\wamp\www\test.php on line 11 and defined,D:\wamp\www\test.php,8 in D:\wamp\www\test.php on line 5 |
那么正确书写say函数的话就不会报错了。
- <?php
- set_error_handler("myerrorfun");
- function myerrorfun($type,$mess,$file,$line){
- if ($type == E_WARNING) {#如果错误类型出现了严重,那么抛出异常(也就是throw new Exception)
- throw new Exception("出现了严重的错误。{$mess},{$file},{$line}");
- }
- }
- function say($language){#定义一个say函数
- echo $language;#直接输出这个函数。
- }
- say("珍惜爱你的人,不要等失去才珍惜。我会一直爱着你。");#故意错误的使用函数。
- ?>
00x4 自定义异常类
前面学习到的Exception是系统早就有了的异常类,那么我们可不可以自定义异常类呢?答案无疑是肯定的。
- <?php
- class MyException extends Exception{#必须要继承Exception否则无效。
- function say(){#定义一个解决方法的函数。
- echo "say函数的语法是:say('strting')";
- }
- }
- echo "11111111111<br />";
- try{
- echo "2222222222222<br />";
- throw new MyException("语法错误。");#抛出语法错误调用catch
- echo "3333333333333<br />";
- }catch(Myexception $e){
- echo $e->getmessage()."<br />";#调用Myerrot类中的getmessage方法。
- echo $e->say()."<br />";#调用MyException类中的解决方法。
- }
- ?>
00x5 多个异常处理
- <?php
- $kaichu = "no";
- class gowc_Exception extends Exception{#创建一个gowc_Exception的类并且继承父类Exception
- function solve(){#建立一个解决方法的方法(此知识点属于OOP,函数即方法,属性即变量)
- echo "该问题的解决方法:厕所坏了可以去公共车厕所。<br />";
- }
- }
- class chizaodian_Exception extends Exception{
- function solve(){
- echo "该问题的解决方法:你可以选择不吃早点。<br />";
- }
- }
- class qushangban_Exception extends Exception{
- function solve(){
- echo "该问题的解决方法:轮胎爆了赶紧换上备胎。<br />";
- }
- }
- class shangban_Exception extends Exception{
- function slove(){
- echo "重新找工作。";
- }
- }
- echo "早上起床<br />";
- //-------------------------------------第一个错误-----------------
- try{
- echo "起床去上厕所<br />";
- throw new gowc_Exception("马桶坏了。");#抛出一个gowc_Exception的异常类。
- echo "上完厕所,做下一件事情。<br />";#如果没有异常执行该行。
- } catch(gowc_Exception $e){
- echo $e->getmessage();#如果有异常执行该行
- echo $e->solve();
- }
- //-------------------------------------第二个错误-----------------
- try{
- echo "去吃早餐<br />";
- throw new chizaodian_Exception("早点已经卖完了。");
- echo "吃完早点准备开车去上班。";
- }catch(chizaodian_Exception $e){
- echo $e->getmessage();
- echo $e->solve();
- }
- //-------------------------------------第三个没有错误-----------------
- try{
- echo "开车去上班。<br />";
- echo "路况很好顺利到公司。<br>";
- }catch(qushangban_Exception $e){
- echo $e->getmessage();
- echo $e->solve();
- }
- //-------------------------------------使用if判断---------------------
- try{
- echo "开始工作。<br />";
- if($kaichu == "yes"){#判断是否被开除。如果是就抛出异常。否者就输出工作完成,
- throw new shangban_Exception("你被开除了");
- }
- echo "工作完成。";
- }catch(shangban_Exception $e){
- echo $e->getmessage();
- echo $e->slove();
- }
- ?>
输出效果如下所示:
THE END
跟着百度学PHP[11]-PHP当中的异常处理的更多相关文章
- 跟着百度学PHP[14]-PDO之Mysql的事务处理2
前面所将仅仅是在纯mysql下的讲解,这节就是要将其搬到PDO台面上来了. 将自动提交关闭. SetAttribute下有一个PDO::ATTR_AUTOCOMMIT 将其设置为0即可关闭,如:$pd ...
- 跟着百度学PHP[17]-PHP扩展CURL的用法详解
实现的功能: 1.实现远程获取和采集内容2.实现PHP 网页版的FTP上传下载3.实现模拟登陆:去一个邮件系统,curl可以模拟cookies4.实现接口对接(API),数据传输等:通过一个平台发送短 ...
- 跟着百度学PHP[4]OOP面对对象编程-16-switch逻辑就语句
直接看案例.较为简单.不解释. <?php $chengji="; #先定义一个变量赋值一个数值 switch ($chengji) { && $chengji > ...
- 跟着百度学PHP[4]OOP面对对象编程-13-魔术方法__set(),__get(),__isset(),__unset()
__set() 在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法) __get() 方法用于获取私有属性值.(在设置私 ...
- 跟着百度学PHP[4]OOP面对对象编程-11-Final关键字
Final的作用就是不允许儿子继承夫类,也就是说不能够对父类在进行调用,否则将会出错. 目录------------------------------------------------------ ...
- 跟着百度学PHP[2]-foreach条件嵌套
任务 通过二维数组,保存了学号.姓名和成绩,可以通过两个循环嵌套,遍历出学号和姓名. <?php $student = array( '001' => array("王大牛&qu ...
- 跟着百度学PHP[7]会话控制(session与cookie) 1.cookie的设置
参考慕课网:http://www.imooc.com/learn/26 参考W3C:http://www.w3school.com.cn/php/php_cookies.asp setcookie() ...
- 跟着百度学PHP[13]-文件上传
PS:上传的时候一定要用POST方法,GET方法不行. 文件上传的entype要改成“mutilpart/form-data”这个编码 <html> <form action=&qu ...
- 跟着百度学PHP[12]-文件处理 文件 目录
00x1 文件的属性 文件属性 <?php //-------------------------定义大小转换函数--------------- function changesize_dw($ ...
随机推荐
- java学习笔记10--泛型总结
java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5-- ...
- 【转】如何成为Python高手
http://www.aqee.net/how-to-become-a-proficient-python-programmer/ 这篇文章主要是对我收集的一些文章的摘要.因为已经有很多比我有才华的人 ...
- 算法笔记_135:格子取数问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 有n*n个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右走,一共走两次(即从左上角往右下角走两趟),把所有经过的格子里的数加起 ...
- TP框架中如何使用SESSION限制登录?
TP框架中如何使用SESSION限制登录? 之前总是被问题今天才明白,最高效的来做页面访问限制问题. OOP思想中的继承特性,实现验证,是否已经登录,不必每个页面都进行判断. 实现如下: 继承Cont ...
- php 一个过虑xxs的代码
一个过虑xxs的代码 public static function removeXSS($str) { $str = str_replace('<!-- -->', '', $str); ...
- 【Oracle】表空间相关集合
创建表空间 1.语法 CREATE [SMALLFILE/BIGFILE] TABLESPACE tablespace_nameDATAFILE '/path/filename' SIZE num[k ...
- 系统学习NIO
概述 适用于有一定编程基础的朋友,想系统学习NIO这块知识的朋友.知识点大体分3块:1:>概念了解(各类IO) 2>NIO的核心(缓存区,通道等) 3>网络IO 详细 代码下载:ht ...
- OSSSME - 开源软件助力中小企业发展
怀揣着为中小企业量身定做一整套开源软件解决方案的梦想开始了一个网站的搭建.http://osssme.org/ [2013-8-2] 由于同时更新2个站点的信息比较繁琐,今后所有和iDempiere. ...
- nginx配置静态文件过期时间
1. 编辑虚拟主机配置文件/usr/local/nginx/conf/vhosts/huangzhenping.conf 说明:采用location方式 1 2 3 4 5 6 7 8 9 10 l ...
- PLSQL Split分割字符串
系统自带的split,使用起来方便,但是如果字符串太长,可能会出现异常,这里,我自己写了一个也是该名字,放在自己的包中,引用的时候带包名就好了. --系统自带的函数 /*CURSOR cur_temp ...