<4D F736F F D C3E6CFF2B6D4CFF35FB5DACEE5D5C D6D0B5C4D2ECB3A3B4A6C0ED5F2E646F63>

Similar documents
OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

内容介绍 6.1 任务预览 6.2 异常 6.3 异常种类与层次结构 6.4 异常处理代码块 try-catch-finally 6.5 throw 语句与 throws 子句 6.6 自定义异常类 6.7 异常处理代码块嵌套 6.8 错误与断言 6.9 本章小结 6.10 实训 6: 除法运算程序

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Java程序设计

无类继承.key

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

chp6.ppt

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

EJB-Programming-3.PDF

EJB-Programming-4-cn.doc

软件工程文档编制

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

《计算概论》课程 第十九讲 C 程序设计语言应用

Microsoft PowerPoint - string_kruse [兼容模式]

Guava学习之Resources

untitled

《大话设计模式》第一章

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

云数据库 RDS SDK

Microsoft Word - PHP7Ch01.docx

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 11 异常处理 Exception Handling.pptx

Microsoft Word - 01.DOC

使用MapReduce读取XML文件

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

「西醫基層總額支付委員會《第28次委員會議紀錄

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft Word - 封面

Stateless Session Beans(无状态bean)的学习

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

Java

PowerPoint 簡報

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

ex

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

Microsoft Word - 新1-12.doc

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

提纲 1 2 OS Examples for 3

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

模板

拦截器(Interceptor)的学习

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之


威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

國立中山大學學位論文典藏.PDF

第 21 讲 CGI 程序 byperl 及 PHP 小结 张高川 遗传学与生物信息学系基础医学与生物科学学院苏州大学医学部 WX: zhanggaochuan QQ: 苏州大学医学部基础医学与生物科

Struts2自定义类型转换.doc

在Spring中使用Kafka:Producer篇

RxJava

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

chap07.key

<4D F736F F D20B5DA3130D5C220B4A6C0EDD2ECB3A3BACDB4EDCEF32E646F63>

第一章

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

Microsoft Word - ch04三校.doc

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

欢迎访问动力节点官方网站,动力节点java0基础免费学习半个月,java就业班免费学习一个月,满意后再交学费,请稊等,正在为您接入咨询老师

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

<4D F736F F F696E74202D20B8DFBCB6D3C3BBA7BDE7C3E6D3EBB6E0CFDFB3CC2E707074>

untitled

3.1 num = 3 ch = 'C' 2

ASP.NET实现下拉框二级联动组件

FileMaker 16 ODBC 和 JDBC 指南

第 一 节 认 识 自 我 的 意 义 一 个 人 只 有 认 识 自 我, 才 能 够 正 确 地 认 识 到 自 己 的 优 劣 势, 找 出 自 己 的 职 业 亮 点, 为 自 己 的 顺 利 求 职 推 波 助 澜 ; 一 个 人 只 有 认 识 自 我, 才 能 在 求 职 中 保 持

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

mvc

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

使用Cassandra和Spark 2.0实现Rest API服务

三种方法实现Hadoop(MapReduce)全局排序(1)

untitled

FileMaker 15 ODBC 和 JDBC 指南


上海盛瑞电子有限公司

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

又拍 UpYun 云存储百度编辑器 UEditor 集成工具 安装使用手册 v

Spark读取Hbase中的数据

Microsoft Word - 第3章.doc

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

untitled

Mechanical Science and Technology for Aerospace Engineering March Vol No. 3 赵海新, 刘夫云, 杨运泽, 许 坤 参数的传递在装配件变型设计中非常重要, 而构造尺寸约束

untitled

然后我们继续 /phpcms/modules/member/index.php 文件 register 函数, 前面的一大部分都是根据 member_setting 的配置信息来判断用户注册过程的合法性, 对注册进行验证的过程 一直到下面的内容,130 行 : 当用户配置信息中 choosemode

《C语言程序设计》教材习题参考答案

Transcription:

第五章 PHP5 异常处理 1

目录 5.1 PHP 中的错误信息...3 5.1.1 php.ini 中配置错误消息...3 5.1.2 php 中错误消息处理...4 5.1.3 php 代码中调整错误级别...5 5.1.4 自定义错误处理...6 5.2 PHP5 中的 SPL 模块...7 5.2.1 什么是 SPL...7 5.2.2 spl.php 中的异常处理类...8 5.2.3 spl.php 中的其它异常类...11 5.3 PHP5 异常捕获...14 5.3.1 异常实例...14 5.3.2 抛出异常...15 5.3.3 在代码中捕获异常...16 5.3.4 在代码中捕获异常 (2)...18 5.3.5 一个 catch 块处理多种异常...19 5.3.6 多个 catch 块处理异常...20 5.3.7 异常处理块嵌套...23 5.3.8 异常向外抛出...24 5.4 PHP5 自定义异常...25 5.4.1 自定义异常...25 5.5 异常处理实例...26 5.5.1 验证实例...26 5.5.2 验证实例代码...29 5.6 小结...34 2

5.1 PHP 中的错误信息 5.1.1 php.ini 中配置错误消息 在 PHP4 中, 没有异常 Exception 这个概念, 只有错误 Error 我们可以通过修改 php.ini 文件来配置用户端输出的错误信息 在 php.ini 中, 一个分号 ; 表示注释 Php.ini 将能够显示的错误类型分为如下种类 ; E_ALL - 所有的错误和警告,( 不包含 E_STRICT). ; E_ERROR - 致命的运行时错误 ; E_RECOVERABLE_ERROR - 几乎致命的运行时错误 ; E_WARNING - 运行时的警告 ( 非致命错误 ) ; E_PARSE - 编译时解析错误 ; E_NOTICE - 运行时的提示, 这些提示常常是代码中的 bug 引起的, 也许是故意的 ( 如使用一 个未初始化的变量, 事实上它被自动初始化成一个空字符串 ) ; E_STRICT - 运行时提示, 能够给于 PHP 建议, 以改变你的代码, 以获得最好的协同性, 并完 善代码的兼容性 ; E_CORE_ERROR - PHP 初始化启动过程中的致命错误 ; E_CORE_WARNING - PHP 初始化启动过程中的非致命错误 ; E_COMPILE_ERROR - 致命的编译错误 ; E_COMPILE_WARNING 编译错误 ( 非致命的错误 ) ; E_USER_ERROR - 用户错误信息 ; E_USER_WARNING - 用户警告信息 ; E_USER_NOTICE - 用户提示信息 ; 在 php.ini 中 error_reporting 控制输出到用户端的消息种类 以下几种是 php.ini 中推荐的几种配置 error_reporting = E_ALL 表示输出所有的信息 error_reporting = E_ALL & ~E_NOTICE 表示输出所有的错误, 除了提示 error_reporting = E_COMPILE_ERROR E_RECOVERABLE_ERROR E_ERROR E_CORE_ERROR 表示输出所有的 ERROR 信息 在 php.ini 中,display_errors 可以设置是否将以上设置的错误信息输出到用户端 display_errors = On 输出到用户端 ( 调试代码时候, 打开这项更方便 ) display_errors = OFF 消息将不会输出到用户端 ( 最终发布给用户时记得改成 off) 3

5.1.2 php 中错误消息处理 错误 在 php 中, 对于错误处理非常的宽松 php 系统会尽量让程序运行下去, 除非遇到致命 例 5-2-1.php 第 5 行, 直接打印一个未赋值变量 $t 时候, 系统报出一个 Notice, 未定义变量 第 7 行, 做除以 0 的运算时, 系统报出一个 Warning, 提示有除以 0 这样的警告, 程序依然在运行 第 9 行, 当实例化一个不存在的类的时候, 发生致命错误, 程序终止运行 再次提示 : 如果不想显示错误信息给用户看到, 设置 php.ini 中 display_errors = OFF 4

5.1.3 php 代码中调整错误级别 除了在 php.ini 文件中可以调整错误消息的显示级别外, 在 php 代码中也可以自定义消 息显示的级别 PHP 提供了一个方便的调整函数 int error_reporting ( [int level] ) 使用这个函数可以定义当前 php 页面中错误消息的显示级别 参数 level 使用了二进制掩码组合的方式 value constant value constant 1 E_ERROR 2 E_WARNING 4 E_PARSE 8 E_NOTICE 16 E_CORE_ERROR 32 E_CORE_WARNING 64 E_COMPILE_ERROR 128 E_COMPILE_WARNING 256 E_USER_ERROR 512 E_USER_WARNING 1024 E_USER_NOTICE 2047 E_ALL 2048 E_STRICT 4096 E_RECOVERABLE_ERROR 例 5-2-2.php 5

5.1.4 自定义错误处理 在 php 中, 可以自定义对错误处理的方式 首先要自定义一个错误处理函数, 然后使用 set_error_handler() 函数向系统声明错误处理函数 代码中产生的错误就会使用这个错误处理函数了 使用 trigger_error() 函数, 可以触发一个 error 例如 trigger_error("age you input must >= 0", E_USER_ERROR), 触发自己的错误信息 例 :5-2-3.php 6

5.2 PHP5 中的 SPL 模块 5.2.1 什么是 SPL 在 PHP5 中有一个独特的部分 SPL - StandardPHPLibrary Modules (PHP 标准库 ) 在 SPL 文档中这样说明的 : SPL PHP 标准库是用来解决标准问题并实现一些高效数据访问的接口和类的集合 你会发现这些类用 PHP 代码编写在 sql.php 文件中, 或在对应例子 内核的.inc 文件中 基于这些内核的实现或在示例目录下的, 也是一些.php 文件 在 SPL 中主要包含了以下内容 : 1. Iterators : SPL offers some advanced iterator algorithms 迭代器 : SPL 提供了一些高级的迭代器运算法则 2. Directories and Files : SPL offers two advanced directory and file handling classes: 目录和文件 :SPL 提供了两个高级路径和文件处理类 3. XML : SPL offers an advanced XML handling class: XML : SPL 提供了一个高级 XML 处理类 4. Array Overloading : SPL offers advanced Array overloading: 数组重载 :SPL 提供了高级数组重载 5. Counting : interface Countable allows to hook into the standard array function count(). 计数 : 接口 Countable 允许勾住标准数组方法 count(). 6. Exceptions : SPL provides a set of standard Exception classes each meant to indicate a certain problem type. 异常 :SPL 规定了一套标准异常类, 每个类都标识了一类确定的问题 7. Observer: SPL suggests a standard way of implementing the observer pattern. 观察者 :SPL 提出了实现观察者模式的标准 关于 SPL 更多资料, 请看 http://www.php.net/~helly/php/ext/spl 而后面我们讲只介绍 SPL 中的异常处理部分 7

5.2.2 spl.php 中的异常处理类 从 PHP5.0 开始, 在 SPL 中引入了异常处理类 Notice : 异常与错误在 PHP 中是两个完全不同的概念 在 PHP 源码包中能找到这个文件 spl.php, 在 spl.php 中定义了一个异常类 Exception 在这个类中, 定义了一些属性如下 : protected $message ; 存储异常信息的变量 private $string; 格式化过以后的异常信息 protected $code; 通过构造函数传递的异常代码 protected $file; 产生异常的 php 文件的文件名 protected $line; 引起异常的代码在 php 文件中所在的行数 private $trace; 引起异常后, 包含相关信息的一个数组 构造函数如下 : function construct($message = NULL, $code = 0) { if (func_num_args()) { // func_num_args() 返回参数数量 $this->message = $message; } $this->code = $code; // 错误代码默认是 0; $this->file = FILE ; // 文件名 $this->line = LINE ; // 行号 $this->trace = debug_backtrace(); // 返回一个包含多个元素 $this->string = StringFormat($this); // 格式化字符串 } 其中还包含了 clone() 方法和对应这些属性的 geter 方法 8

spl.php 源代码如下 : 9

10

5.2.3 spl.php 中的其它异常类 在 SPL 中还定义了其它的异常类, 以对应不同的异常类型 这些异常类都是 Exception 类的子类 在 Exception 类有两个直接子类 LogicException 和 RuntimeException, 分别表示逻辑异常 和执行异常 LogicException 又衍生出其它的逻辑异常子类 11

class LogicException extends Exception 程序中的逻辑错误的异常类, 它是 Exception 类的直接子类 class BadFunctionCallException extends LogicException 当不合法的函数被调用产生的异常类 class BadMethodCallException extends BadFunctionCallException 当不合法的方法被调用产生的异常类 class DomainException extends LogicException 表示一个值不在有效范围内的异常 class InvalidArgumentException extends LogicException 表示传递了无效的参数产生的异常 class LengthException extends LogicException 表示一个参数超过了许可的长度的异常 class OutOfRangeException extends LogicException 表示请求检索超越了数组等容器最大长度的异常 RuntimeException 衍生出其它运行异常子类 12

class RuntimeException extends Exception 只有在执行时才能发现的异常, 是 Exception 的直接子类 class OutOfBoundsException extends RuntimeException 表示请求检索超越了数组等容器最大长度的异常 class OverflowException extends RuntimeException 表示算法 / 缓存溢出异常 class RangeException extends RuntimeException 运行期间的范围异常 class UnderflowException extends RuntimeException 运行期间的算法 / 缓存的向下溢出异常 在 spl.php 中所有 Exception 子类的代码都仅仅是类的定义和简单的父类继承 而方法内部没有任何扩展 重写 如 :LogicException 的定义 又如 :LengthException 的定义部分 13

5.3 PHP5 异常捕获 5.3.1 异常实例 可以通过实例化 Exception 类或者它的子类来创建一个异常实例 有了这个异常实例, 就可以通过 Exception 中定义好的 getter 方法, 获得相应的属性值 例 5-3-1.php 例 5-3-2.php 14

5.3.2 抛出异常 在 PHP5 中使用 throw 关键字, 向外抛出一个异常实例 如果这个异常如果未经处理, 将会导致系统产生致命错误, 而使代码终止 例 5-3-3.php 根据需求, 我们可以向系统抛出不同的异常 在 php 中数组越界是不会产生知名错误的, 而下面的代码抛出一个数组越界的异常, 导致代码运行终止 例 5-3-4.php 15

5.3.3 在代码中捕获异常 可以通过 PHP5 支持的 try catch 语句捕获并处理异常 语法如下 : try{ // 可能引发异常的语句 }catch( 异常类型异常实例 ){ // 异常处理语句 } 在 try 块中, 放置可能产生异常的代码片段 在 catch 块中放置对这个异常处理的代码 如 : try{ throw new Exception( new Exception ); // 引发抛出异常 }catch(exception $ex){ echo $ex; // 打印这个异常对象 } 如果 try 块未产生任何异常,try 块将运行完毕,catch 块内容不会被执行 try 块如果抛出了异常, 会立刻在 catch 中寻找可以捕获改异常的 catch 块, 并运行相应的 catch 块代码, 然后跳出 try catch 块继续运行 而 try 块中抛出异常后面的代码将被跳过 如果 try 块中的异常不能被 catch 块捕获, 将抛向系统引发系统致命错误, 代码终止运行 在 catch 中, 异常类型后面跟的是一个变量, 这个变量将指向内存中被捕获的异常实例 未使用异常处理时, 我们从一个数组中取值, 如果数组越界,PHP 只会报出一个错误 Notice, 我们无法对这些错误做任何的处理 例 5-3-5.php 16

在下面例子中, 取值超过了数组边界, 于是引发了自定义异常 在 catch 块做了处理 例 :5-3-6.php 取值没有引发异常的代码 例 5-3-7.php 17

5.3.4 在代码中捕获异常 (2) 大家注意到 catch(exception $ex) 中 Exception 这个类名, 下面解释它的具体意义 在 catch 块中能捕获在 catch() 块中声明的捕获的异常和其子类类型实例 下面的例子, 抛出一个 OutOfBoundsException 的异常, 而 catch 语句捕获 DomainException 异常 这个异常不会被 catch 语句捕获, 而直接抛向了系统, 引发了一个致命错误, 程序被终止了 例 5-3-8.php 在 catch 块中能捕获 catch() 块里声明的异常的子类异常 下面的例子抛出了 OutOfBoundsException 异常, 由它的父类 RuntimeException 捕获 例 5-3-9.php 18

5.3.5 一个 catch 块处理多种异常 在 catch 块中能捕获在 catch() 块中声明的捕获的异常和其子类类型实例 在下面的代码中,catch 块即可以捕获第 9 行的异常, 也可以捕获第 14 行的异常 实现了一个异常处理块捕获多种异常 例 5-3-10.php Exception 是所有异常类的父类,catch(Exception $ex) 可以捕获 try 块中的任何异常 例 :5-3-11.php 19

5.3.6 多个 catch 块处理异常 一个 try 块可以跟随多个 catch 块, 每个 catch 块捕获不同的异常 下面例子的第 7 行, 使用 rand 函数产生了一个 0 或 1 的随机数, 反复运行这个代码会随机抛出逻辑异常或执行异常 在 try 块后, 有两个 catch 块, 分别捕获并处理对应的异常, 注意查看不同 例 5-3-12.php 20

当有异常被抛出, 系统从 catch 片段中寻找能处理这个异常的 catch 块, 前面说过一个父类的 catch 块可以捕获子类的异常实例 在 catch 片段中, 如果父类的 catch 块在前面, 将屏蔽掉后面对应的子类 catch 块的功能 下面例子中引发的两种异常, 都被第一个 Exception 类型的 catch 块捕获了 例 5-3-13.php 21

把两个 catch 块的顺序调换, 将子类的异常捕获放在前面, 父类的异常捕获放在后面 就会看到两个 catch 块能各司其职了 例 :5-3-14.php 22

5.3.7 异常处理块嵌套 异常处理块只能处理自己 catch 块中的异常, 已经处理过的异常将不会向外抛出 例 5-3-15.php 如果内部块不能捕获异常, 这个异常将继续向外抛出 直到能够被捕获为止 例 5-3-16.php 23

5.3.8 异常向外抛出 代码中一旦 throw 一个异常实例, 系统会寻找能够处理这个异常的 try catch 块, 如果当前方法不能够处理这个异常, 就会向外抛出 抛向调用这个方法的代码, 一直向外抛出, 如果抛到最外层都无法处理这个异常, 会引发致命错误, 代码终止 我们可以在方法引用的任何一个环节, 根据业务需求决定捕获异常的位置 例 5-3-17.php 24

5.4 PHP5 自定义异常 5.4.1 自定义异常 在 PHP5 中可以自定义异常, 自定义的异常必须继承自 Exception 类或者它的子类 例 5-4-1.php 如果自定义的类未继承自 Exception 或者其子类, 就会出现不能运行的错误 例 5-4-2.php 25

5.5 异常处理实例 5.5.1 验证实例 本例将写用户名和密码长度验证并对用户名和密码设定为只能是字符, 配合正则表达式完成 设定用户名和密码长度必须在 3-8 个之间, 并且只能是字符与数字如何与数据库链接, 进行数据库验证, 就不在本例表达 如果用户名和密码长度不够, 提交后会提示 26

如果过长会提示 如果输入字符有 (* 等符号不合法 27

如果验证成功进入登录成功页面 用户输入的用户名和密码可以显示在用户界面 如果用户直接输入登录成功 loginsuccess.php 页面, 会转到登录页面 28

5.5.2 验证实例代码 User.php 实现功能 : 定义 User 接口 实现存放用户信息的类 通过工厂模式返回用户类实例 定义一些参数的类,Properties.php 在这个类中集中定义了一些参数, 方便进行后期一些与程序逻辑关系不大的维护 29

自定义类, MyException.php 自定义了用户名和密码两个独立的异常类, 以及其它子类 验证用户名和密码长度合法性的类 Validate.php 在 validatename 方法和 validatepassword 两个方法中, 分别对长度做了判断和验证 并通过正则表达式, 对用户输入的合法性做了验证 虽然可以通过正则表达式一次验证用户字符合法性和长度, 本例没有这样写是为了向方法外抛出长度不同的异常, 以及显示给用户的信息 30

登录页面 login.php 在第 12 行和第 18 行, 分别取出 session 中的用户名密码, 以及错误信息 31

界面如下 32

登录会提交给 loginvalidate.php 这段代码相当于 MVC 中的 controller 控制器 登录成功页面,loginSuccess.php 显示用户登录信息, 判断 session 33

5.6 小结 34