PHP如何抛出异常处理错误

首先要知道什么是PHP异常?

异常(Exception)用于在指定的错误发生时改变脚本的正常流程。
PHP 5 提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

当异常被触发时,通常会发生:

当前代码状态被保存
代码执行被切换到预定义的异常处理器函数
根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
我们将展示不同的错误处理方法:

异常的基本使用
创建自定义的异常处理器
多个异常
重新抛出异常
设置顶层异常处理器
异常的基本使用
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。

如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 “Uncaught Exception” (未捕获异常)的错误消息。

让我们尝试抛出一个异常,同时不去捕获它:


代码如下:

<?php
//create function with an exceptionfunction
checkNum($number) {
if($number>1) {
throw new Exception(”Value must be 1 or below”);
} return true;
}
//trigger
exceptioncheckNum(2);
?>

上面的代码会获得类似这样的一个错误:

Fatal error: Uncaught exception ‘Exception' with message ‘Value must be 1 or below' in C:\webfolder\test.php:6 Stack trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
Try, throw 和 catch
要避免上面例子出现的错误,我们需要创建适当的代码来处理异常。

处理处理程序应当包括:

Try - 使用异常的函数应该位于 “try” 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 “throw” 必须对应至少一个 “catch”
Catch - “catch” 代码块会捕获异常,并创建一个包含异常信息的对象
让我们触发一个异常:

<?php//创建可抛出一个异常的函数function checkNum($number) { if($number>1) { throw new Exception(”Value must be 1 or below”); } return true; }//在 “try” 代码块中触发异常try { checkNum(2); //If the exception is thrown, this text will not be shown echo ‘If you see this, the number is 1 or below'; }//捕获异常catch(Exception $e) { echo ‘Message: ‘ .$e->getMessage(); }?>
上面代码将获得类似这样一个错误:

Message: Value must be 1 or below
例子解释:
上面的代码抛出了一个异常,并捕获了它:

创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
在 “try” 代码块中调用 checkNum() 函数。
checkNum() 函数中的异常被抛出
“catch” 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息
不过,为了遵循“每个 throw 必须对应一个 catch”的原则,可以设置一个顶层的异常处理器来处理漏掉的错误。
创建一个自定义的 Exception 类
创建自定义的异常处理程序非常简单。我们简单地创建了一个专门的类,当 PHP 中发生异常时,可调用其函数。该类必须是 exception 类的一个扩展。

这个自定义的 exception 类继承了 PHP 的 exception 类的所有属性,您可向其添加自定义的函数。

我们开始创建 exception 类:


代码如下:

<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = ‘Error on line ‘.$this->getLine().' in ‘.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg;
}
}
$email = “someone@example…com”;try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid throw
new customException($email);
}
}catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}?>

这个新的类是旧的 exception 类的副本,外加 errorMessage() 函数。正因为它是旧类的副本,因此它从旧类继承了属性和方法,我们可以使用 exception 类的方法,比如 getLine() 、 getFile() 以及 getMessage()。

例子解释:
上面的代码抛出了一个异常,并通过一个自定义的 exception 类来捕获它:

customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一条错误消息
把 $email 变量设置为不合法的 e-mail 地址字符串
执行 “try” 代码块,由于 e-mail 地址不合法,因此抛出一个异常
“catch” 代码块捕获异常,并显示错误消息
多个异常
可以为一段脚本使用多个异常,来检测多种情况。

可以使用多个 if..else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息:


代码如下:

<?php
class customException extends Exception{public function errorMessage(){
//error
message$errorMsg = ‘Error on line ‘.$this->getLine().' in ‘.$this->getFile().': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = “someone@example.com”;try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid throw new
customException($email);
}
//check for “example” in mail address
if(strpos($email, “example”) !== FALSE) { throw new Exception(”$email is an example e-mail”); } }catch (customException $e) { echo $e->errorMessage(); }catch(Exception $e) { echo $e->getMessage(); }?>

例子解释:
上面的代码测试了两种条件,如何任何条件不成立,则抛出一个异常:

customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
执行 “try” 代码块,在第一个条件下,不会抛出异常。
由于 e-mail 含有字符串 “example”,第二个条件会触发异常。
“catch” 代码块会捕获异常,并显示恰当的错误消息
如果没有捕获 customException,紧紧捕获了 base exception,则在那里处理异常。
重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 “catch” 代码块中再次抛出异常。

脚本应该对用户隐藏系统错误。对程序员来说,系统错误也许很重要,但是用户对它们并不感兴趣。为了让用户更容易使用,您可以再次抛出带有对用户比较友好的消息的异常:


代码如下:

<?php
class customException extends Exception { public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } }$email = “someone@example.com”;try { try {
//check for “example” in mail address
if(strpos($email, “example”) !== FALSE) {
//throw exception if email is not valid throw new
Exception($email); } } catch(Exception $e) {
//re-throw exception throw new
customException($email); } }catch (customException $e) {
//display custom message
echo $e->errorMessage(); }
?>

例子解释:
上面的代码检测在邮件地址中是否含有字符串 “example”。如果有,则再次抛出异常:

customException() 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法。
创建 errorMessage() 函数。如果 e-mail 地址不合法,则该函数返回一个错误消息。
把 $email 变量设置为一个有效的邮件地址,但含有字符串 “example”。
“try” 代码块包含另一个 “try” 代码块,这样就可以再次抛出异常。
由于 e-mail 包含字符串 “example”,因此触发异常。
“catch” 捕获到该异常,并重新抛出 “customException”。
捕获到 “customException”,并显示一条错误消息。
如果在其目前的 “try” 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。
设置顶层异常处理器 (Top Level Exception Handler)
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。


代码如下:

<?php
function myException($exception){
echo “<b>Exception:</b> ” , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

以上代码的输出应该类似这样:

Exception: Uncaught Exception occurred
在上面的代码中,不存在 “catch” 代码块,而是触发顶层的异常处理程序。应该使用此函数来捕获所有未被捕获的异常。
异常的规则
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
使用多个 catch 代码块可以捕获不同种类的异常。
可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
简而言之:如果抛出了异常,就必须捕获它。

(0)

相关推荐

  • php错误、异常处理机制(补充)

    一.错误处理 异常处理: 意外,是在程序运行过程中发生的意料这外的事,使用异常改变脚本正常流程 PHP5中的一个新的重要特性 复制代码 代码如下: if(){ }else{ } try { }catch(异常对象){ } 1. 如果try中代码没有问题,则将try中代码执行完后就到catch后执行 2. 如果try中代码有异常发生,则抛出一个异常对象(使用throw),抛出给了catch中的参数, 则在try中代码就不会再继续执行下去 直接跳转到catch中去执行, catch中执行完成, 再继

  • 实例讲解如何在PHP的Yii框架中进行错误和异常处理

    Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler,set_error_handler实现的.通过这两个PHP内置函数,可以对程序中未捕获的异常以及错误进行接管处理,从而提高程序的可维护性.这在大型系统是至关重要的,当发生错误时,我们希望能将相关详细信息记录,甚至是即时发送报警,从而缩短故障修复时间,提高整个系统的稳定性. 默认情况下,Yii会将异常处理分配给CApplication::handleException,

  • 一个显示效果非常不错的PHP错误、异常处理类

    一.效果图: 二.实现代码 复制代码 代码如下: <?php // 自定义异常函数set_exception_handler('handle_exception'); // 自定义错误函数set_error_handler('handle_error'); /** * 异常处理 * * @param mixed $exception 异常对象 * @author blog.snsgou.com */function handle_exception($exception) { Error::ex

  • PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法

    异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况称为异常. PHP 5 添加了类似于其它语言的异常处理模块.在 PHP 代码中所产生的异常可被 throw 语句抛出并被 catch 语句捕获.需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常.每一个 try 至少要有一个与之对应的 catch.使用多个 catch 可以捕获不同的类所产生的异常.当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一

  • PHP中的错误处理、异常处理机制分析

    例: 复制代码 代码如下: <?php $a = fopen('test.txt','r'); //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 ?> 那么正确的写法应该如下: 复制代码 代码如下: <?php if(file_exists('test.txt')){ $f=fopen('test.txt','r'); //使用完后关闭 fclose($f); } ?> 一.PHP错误处理的三种方式A.简单的die()语句: 等价于exit(); 例: 复制代码 代码如

  • 浅谈PHP中的错误处理和异常处理

    错误处理:          1. 语法错误     2. 运行时的错误     3. 逻辑错误 错误报告:                  错误E_ERROR         警告E_WARNING         注意E_NOTICE 开发阶段:开发时输出所有的错误报告,有利于我们进行调试 运行阶段:不要让程序输出任何一种错误报告 将错误报告写入日志中 一.   指定错误报告error_reporting=E_ALL(在php.inn) 二.   关闭错误输出display_errors=

  • PHP错误和异常处理功能模块示例

    本文实例讲述了PHP错误和异常处理功能模块.分享给大家供大家参考,具体如下: 一.错误类型和基本的调试方法 PHP程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行时错误: 这种错误一般不会阻止PHP脚本的执行,但会阻止当前要做的事情.输出一条错误,但php脚本继续执行 逻辑错误: 这种错误最麻烦,既不阻止脚本执行,也不输出错误消息. 一个异常则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正

  • PHP中常见的错误与异常处理总结大全

    前言 当我们开发程序时,程序出现问题是很常见的,当出现了异常与错误我们该如何处理呢?本文将详细给大家介绍PHP错误与异常处理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 一.PHP错误处理 1.语法错误 2.运行时错误 3.逻辑错误:不提示错误,但功能不对,最麻烦 4.三种级别:notice/warning/fatal error(无法继续执行) 5.错误报告显示: a.可以在php.ini中修改error_reporting项目,以限定错误报告类型,如:error

  • 解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题

    看了下手册,官方介绍如下:http://www.kancloud.cn/manual/thinkphp5/126075 本着严谨的原则,5.0版本默认情况下会对任何错误(包括警告错误)抛出异常,如果不希望如此严谨的抛出异常,可以在应用公共函数文件中或者配置文件中使用error_reporting方法设置错误报错级别(请注意,在入口文件中设置是无效的),例如: // 异常错误报错级别, error_reporting(E_ERROR | E_PARSE ); 我直接在application目录下的

  • PHP如何抛出异常处理错误

    首先要知道什么是PHP异常? 异常(Exception)用于在指定的错误发生时改变脚本的正常流程. PHP 5 提供了一种新的面向对象的错误处理方法. 异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程.这种情况称为异常. 当异常被触发时,通常会发生: 当前代码状态被保存 代码执行被切换到预定义的异常处理器函数 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本 我们将展示不同的错误处理方法: 异常的基本使用 创建自定义的异常处理器

  • Java中的异常处理用法及其架构和使用建议

    Java异常是Java提供的一种识别及响应错误的一致性机制. Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性.在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了"什么"被抛出,异常堆栈跟踪回答了"在哪"抛出,异常信息回答了"为什么"会抛出. Java异常机制用到的几个关键字:try.catch.finally.throw.throws. 关键字 说

  • Python缩进和冒号详解

    对于Python而言代码缩进是一种语法,Python没有像其他语言一样采用{}或者begin...end分隔代码块,而是采用代码缩进和冒号来区分代码之间的层次. 缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行. 例如: if True: print("Hello girl!") #缩进一个tab的占位 else: #与if对齐 print("Hello boy!") #缩进一个tab的占位 Python对代码的缩进要求非常严格

  • 品味Spring 的魅力

    Spring的哲学是在不影响Java对象的设计的情况下将Java对象加入到框架中. EJB的框架采用了一种侵略性(Invasive)的方法来设计对象,它要求你在设计中加入符合EJB规范的代码.一些轻量级的COP框架,例如Avalon,也要求对象设计时必须符合某种规范,例如Serviceable接口,这种做法是典型的Type 1做法. 这种设计思路要求Spring采用一种动态的.灵活的方式来设计框架.所以spring大量采用了反射.首先spring要解决的一个问题就是如何管理bean.因为IOC的

  • Java异常简介和架构_动力节点Java学院整理

    Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制. Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性.在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了"什么"被抛出,异常堆栈跟踪回答了"在哪"抛出,异常信息回答了"为什么"会抛出. Java异常机制用到的几个关键字:try.catch.finally.throw.thro

  • Python object类中的特殊方法代码讲解

    python版本:3.8 class object: """ The most base type """ # del obj.xxx或delattr(obj,'xxx')时被调用,删除对象中的一个属性 def __delattr__(self, *args, **kwargs): # real signature unknown """ Implement delattr(self, name). "&q

  • Python3爬虫中Splash的知识总结

    Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库.利用它,我们同样可以实现动态渲染页面的抓取. 1. 功能介绍 ·利用Splash,我们可以实现如下功能: ·异步方式处理多个网页渲染过程: ·获取渲染后的页面的源代码或截图: ·通过关闭图片渲染或者使用Adblock规则来加快页面渲染速度: ·可执行特定的JavaScript脚本: ·可通过Lua脚本来控制页面渲染过程: ·获取渲染的详细过程并通过HAR(

  • Java安全框架——Shiro的使用详解(附springboot整合Shiro的demo)

    Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理 三个核心组件:Subject, SecurityManager 和 Realms Subject代表了当前用户的安全操作 SecurityManager管理所有用户的安全操作,是Shiro框架的核心,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务. Realm充当了Shiro与应用安全数据间的"桥梁"或者"连接器&q

  • C/C++中异常处理详解及其作用介绍

    目录 概述 异常处理 异常处理机制 函数声明指定异常 练习 案例一 案例二 概述 作为一名专业写 Bug, 编程一天改 bug 一周的程序媛. 学会异常处理是非常重要的. 我们不仅要考虑没有错误的理想情况, 更要考虑存在错误时的情况. Debug 可以帮助我们尽快发现错误, 消除错误. 错误类别: 语法错误 运行错误 逻辑错误 异常处理 设计程序时, 事先分析程序运行时可能出现的各种意外情况, 定制出相应的处理方法. 异常处理指对运行时出现的差错以及其他例外情况的处理. 没有异常处理程序时, 运

随机推荐