- PHP 教程
- PHP - 首页
- PHP - 路线图
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔术常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混淆
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与 I/O
- PHP - 数学函数
- PHP - Heredoc & Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期与时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 比较符
- PHP 控制语句
- PHP - 决策制定
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理 CSV 文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象的 PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - Traits
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - Final 关键字
- PHP - 重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web 开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET & POST
- PHP - 文件上传
- PHP - Cookie
- PHP - Session
- PHP - Session 选项
- PHP - 发送邮件
- PHP - 净化输入
- PHP - Post-Redirect-Get (PRG)
- PHP - Flash 消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 编码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 针对 C 开发人员
- PHP - 针对 PERL 开发人员
- PHP - 框架
- PHP - Core PHP vs. 框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤后的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 期望值
- PHP - Use 语句
- PHP - 整数除法
- PHP - 已弃用的特性
- PHP - 已移除的扩展和 SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
PHP – 异常
在 7.0 版本之前,PHP 解析器用于在响应各种条件时报告错误。每个错误都属于某种预定义类型。PHP7 改变了错误报告机制。大多数错误现在通过抛出异常来报告,而不是传统的错误报告。
PHP 中的异常处理机制与许多其他语言类似,并使用try、catch、throw和finally关键字实现。
Throwable 接口
PHP 中的异常实现了Throwable 接口。Throwable 接口充当任何可通过 throw 语句抛出的对象的基类,包括 Error 和 Exception 对象。
用户定义的类不能直接实现 Throwable 接口。相反,要声明用户定义的异常类,它必须扩展Exception 类。
包含潜在异常的 PHP 代码包含在一个try块中。如果找到异常对象,则会抛出该对象,以方便捕获潜在异常。每个try块都必须至少有一个对应的catch或finally块。此外,可能有多个 catch/finally 块对应于一个try块。
try { // throw errors in the try-block // if an error occurs we can throw an exception throw new Exception('this is an error.'); } catch(Exception $e) { // catch the throws in the catch-block // do something with the exception object, eg. // display its message echo 'Error message: ' .$e->getMessage(); }
如果抛出异常且没有catch块,则异常将“冒泡”直到找到匹配的catch块。如果调用栈一直展开到全局范围而没有遇到匹配的 catch 块,则将调用全局异常处理程序(如果已设置),否则程序将以致命错误终止。
set_exception_handler
如果异常未在 try/catch 块中捕获,此函数设置默认异常处理程序。回调执行后,程序执行将停止。
set_exception_handler(?callable $callback): ?callable
$callback 参数是要在发生未捕获异常时调用的函数的名称。必须在调用 set_exception_handler() 之前定义此函数。此处理程序函数需要接受一个参数,该参数将是抛出的异常对象。
该函数返回先前定义的异常处理程序的名称,或在出错时返回 NULL。如果未定义先前的处理程序,则也返回 NULL。
示例
查看以下示例:
<?php function handler($ex) { echo "Uncaught exception is : " , $ex->getMessage(), "\n"; } set_exception_handler('handler'); throw new Exception('Not Found Exception'); echo "not included Executed\n"; ?>
它将产生以下输出:
Uncaught exception is : Not Found Exception
SPL 异常
标准 PHP 库包含预定义的异常:
序号 | 预定义异常 |
---|---|
1 | LogicException 表示程序逻辑错误的异常。 |
2 | BadFunctionCallException 如果回调引用未定义的函数或缺少某些参数,则抛出此异常。 |
3 | BadMethodCallException 如果回调引用未定义的方法或缺少某些参数,则抛出此异常。 |
4 | DomainException 如果值不符合定义的有效数据域,则抛出此异常。 |
5 | InvalidArgumentException 如果参数不是预期类型,则抛出此异常。 |
6 | LengthException 如果长度无效,则抛出此异常。 |
7 | OutOfRangeException 请求非法索引时抛出此异常。 |
8 | RuntimeException 如果发生只能在运行时发现的错误,则抛出此异常。 |
9 | OutOfBoundsException 如果值不是有效的键,则抛出此异常。 |
10 | OverflowException 向已满容器添加元素时抛出此异常。 |
11 | RangeException 抛出此异常以指示程序执行期间的范围错误。除下溢/上溢之外的算术错误。 |
12 | UnderflowException 在空容器上执行无效操作(例如删除元素)时抛出此异常。 |
13 | UnexpectedValueException 如果值与一组值不匹配,则抛出此异常。 |
用户定义的异常
您可以定义一个扩展基本 Exception 类的自定义异常类。以下脚本定义了一个名为 myException 的自定义异常类。如果 $num 的值小于 0 或大于 100,则会抛出此类型的异常。
示例
Exception 类的 getMessage() 方法返回错误消息,getLine() 方法返回出现异常的代码行。
<?php class myException extends Exception { function message() { return "error : ". $this->getMessage(). "in line no". $this->getLine(); } } $num=125; try { if ($num>100 || $num<0) throw new myException("$num is invalid number"); else echo "$num is a valid number"; } catch (myException $m) { echo $m->message(); } ?>
使用$num=125和$num=90运行上述代码以获取错误消息和有效数字的消息:
error : 125 is invalid number in line no 10