跟着百度学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的话那么就是有异常。

 1 <?php
 2 echo "早上起床<br />";
 3 try{
 4 echo "开车上班。<br />";
 5 throw new Exception("车子爆胎。<br />");//抛出异常,有异常第六行的echo不进行执行直接执行catch
 6 echo "路况很好。";
 7 }catch(Exception $e){
 8 echo $e->getmessage();//其实这里的$e就是异常。Exception是系统已经定义好了的了一个类,调用其getmessage方法即可。
 9 echo "换上备胎,继续开车去上班。<br />";
10 }
11 ?>

本来是按照顺序,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类中的解决方法。
}
 ?>


THE END

时间: 2024-10-24 01:48:01

跟着百度学PHP[11]-PHP当中的异常处理的相关文章

跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

跟着百度学PHP[4]OOP面对对象编程-5-内部引用$this

$this就是对象内部代表这个对象的引用 可以调用被封装的方法或者属性! <?php class Person{ private $name; private $age="21"; var $sex; function play(){ echo "他正在玩儿呢"; } private function Hello(){ //使用private封装hello方法.该方法不可直接调用.但是可以在内部使用$this调用. echo "这个是被封装的内容&q

跟着百度学PHP[4]OOP面对对象编程-12-抽象类

什么是抽象方法?我们在类里面定义的没有方法体的方法就是抽象方法.所谓的没有方法体指的是,在方法声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字“abstract”来修饰. 目录==================================== 1.声明一个抽象类,抽象方法(案例一) 2.继承一个抽象类(实例二) ======================================= 案例一 <?php abstract

跟着百度学PHP[4]OOP面对对象编程-12-对象接口技术(interface)

PHP与大多数面向对象编程语言一样,不支持多重继承.也就是说每个类只能继承一个父类. 接口正是解决每个类只能继承一个父类这个问题的 接口用什么权限,继承的那个方法也要使用什么权限. 接口的声明使用:interface 接口的继承使用:implements 目录++++++++++++++++++++++++++++++++++++++++++++ 00x1 接口的声明以及接口的引用(案例一) 00x2 如何继承多个接口(案例二) 00x3 判断某个对象是否实现了某个接口(案例三) +++++++

跟着百度学PHP[4]OOP面对对象编程-7-封装性private

所谓封装顾名思义,如同箱子般给封装起来.结合前面的来说就是对属性或者方法,封装后的方法或属性只能有类内部进行调用.外部调用不了. 封装性的好处: 1.信息隐藏 2.http://www.cnblogs.com/yisss/p/3412702.html 3.https://zhidao.baidu.com/question/2203595698703331308.html 目录------------------------------------- 00X1 进行封装 00x2 如何调用封装的属

跟着百度学PHP[4]OOP面对对象编程-6-构造方法(__construct)和构析方法(__destruct)

函数就是成员方法(方法有三:构造方法.成员方法.析构方法) 下面是两种方法. 构造方法和构析方法 00x1 构造方法 构造方法会在创建对象之后自动调用.其名称为__construct <?php class Student{ var $name; var $age; var $sex; function __construct(){ //可以从输出中看得出来,我们并没有输出这个方法,但是他自动输出了.这个就是构造方法的作用,会自动的被调用! echo "520PHP<br />

跟着百度学PHP[10]-读取COOKIE案例

<?php if(!isset($_COOKIE['visittime'])){ #使用$_COOKIE获取visittime,如果不存在就执行下面的语句块,否则执行else setcookie('visittime',date('y-m-d h-i-s'));#生成一个visittime的cookie. echo "你是第一次进入网站."; }else{ setcookie('visittime',date('y-m-d h-i-s')); echo "你上一次访问网

跟着百度学PHP[4]OOP面对对象编程-15-魔术方法__call方法

在程序开发中,如果在使用对象调用对象内部方法时候,调用的这个方法不存在那么程序就会出错,然后程序退出不能继续执行.那么可不可以在程序调用对象内部 不存在的方法时,提示我们调用的方法及使用的参数不存在,但程序还可以继续执行,这个时候我们就要使用在调用不存在的方法时自动调用的方 法“__call()”.  THE END 跟着百度学PHP[4]OOP面对对象编程-15-魔术方法__call方法

跟着百度学PHP[13]-文件上传

PS:上传的时候一定要用POST方法,GET方法不行. 文件上传的entype要改成“mutilpart/form-data”这个编码 <html> <form action="upload.php" method="POST" enctype="mutilpart/form-data"> <input type="hidden" name="MAX_FILE_SIZE">