例外是用来改变的正常流通脚本,如果出现错误指定
什么是异常
在PHP 5中来到一个新的面向对象的方式处理错误。
异常处理是用来改变正常流通的执行代码,如果某一特定的错误(例外)条件发生。这个条件是所谓的一个例外。
这就是通常当一个例外是触发:
目前的代码保存状况
该代码执行将切换到预先确定的(自订)例外处理函数
根据不同的情况下,处理程序就可以恢复执行的代码保存状态,终止脚本执行或继续脚本从一个不同的位置中的代码
我们将表现出不同的错误处理方法:
基本使用例外
创建自定义异常处理
多例外
再扔一个例外
设置顶层异常处理
注:例外只应该用于错误条件,不应该被用来跳转到另一地点的代码在指定点。
基本使用的例外
当一个异常,下面的代码将无法执行, PHP将试图找到匹配的“ catch ”块。
如果一个例外是没有抓住,一个致命的错误将印发了“ Uncaught异常”的消息。
可以尝试抛出一个例外没有赶上它:
<?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception checkNum(2); ?>
以上代码将得到一个错误这样的:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in C:webfoldertest.php:6 Stack trace: #0 C:webfoldertest.php(12): checkNum(28) #1 {main} thrown in C:webfoldertest.php on line 6
Try, throw and catch
为了避免错误从上面的例子中,我们必须创造适当的代码来处理一个例外。
适当的异常代码应包括以下内容:
尝试-函数使用一个例外应在“尝试”区块。如果例外不会触发,代码将继续正常。但是,如果触发的例外,一个例外是“扔”
扔掉-这是你如何触发一个例外。每一个“扔”必须至少有一个“迎头赶上”
抓住-这是一种“ c atch”块撷取一个例外,并创建一个对象含有异常信息
可以尝试触发一个例外有效的代码:
<?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception in a "try" block 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 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
以上代码将得到一个错误这样的:
Message: Value must be 1 or below
为例解释说:
上述的程式码罚球一个例外,捕获它:
该checkNum ( )函数创建。它会检查,如果数大于1 。如果是这样,一个异常
该checkNum ( )函数被称为一个“尝试”块
唯一的例外内checkNum ( )函数抛出
在“ catch ”块retrives例外,并创建一个对象(英文)载有异常信息
错误讯息的例外是呼应呼吁$电子商务“ getMessage ( )从物体的例外
然而,有一个方式,这里的“每一个扔必须有一个追赶”的规则是设定一个最高水平异常处理程序来处理错误的漏网之鱼。
-------------------------------------------------- ------------------------------
创建自定义异常处理类
创建自定义异常处理程序相当简单。我们只是创建一个特殊阶层的功能,可以说是一个例外时,发生在PHP 。
类必须有一个延伸的例外类。
自定义异常处理类继承的财产从PHP的异常处理类,你可以添加自定义它的职能。
让我们创造一个例外类别:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': '.$this->getMessage().' 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(); } ?>
新的类别是一份旧的例外类的增加errorMessage ( )函数。由于这是一份旧的阶级,它继承了属性和方法从旧的阶级,我们可以使用一流的方法除了像返回发生异常( )和getFile ( )和getMessage ( ) 。
为例解释说:
上述的程式码罚球一个例外,它捕获了自定义异常类:
该customException ( )创建一流的延伸旧的例外类。这样,它继承了所有方法和属性从旧的例外类
该errorMessage ( )函数创建。此函数返回一个错误信息,如果e - mail地址是无效的
美元的电子邮件变量设置为一个字符串,不是一个有效的e - mail地址
的“尝试”阻止执行和异常以来, e - mail地址是无效的
在“ catch ”块渔获量的例外,并显示错误讯息
-------------------------------------------------- ------------------------------
多例外
这是可能的脚本来使用多个例外来检查多个条件。
可以使用一些如..其他区块,一个开关,或巢多个例外。这些例外可以使用不同的例外班级和返回不同的错误信息:
<?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': '.$this->getMessage().' 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 ( )创建一流的延伸旧的例外类。这样,它继承了所有方法和属性从旧的例外类
该errorMessage ( )函数创建。此函数返回一个错误信息,如果e - mail地址是无效的
美元的电子邮件变量设置为一个字符串,是一个有效的e - mail地址,但包含字符串“榜样”
的“尝试”阻止执行和一个例外是不扔的首要条件
第二个条件触发一个例外,因为电子邮件包含字符串“榜样”
在“ catch ”块渔获量的例外,并显示正确的错误讯息
如果没有customException追赶,只有例外的基础副渔获物,除将处理有
-------------------------------------------------- ------------------------------
再扔例外
有时,当一个异常,你不妨来处理它不同于标准的方式。这是有可能抛出一个例外,第二次在“ 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(); } ?>
为例解释说:
以上代码的测试,如果电子邮件地址包含字符串“榜样”中,如果这样做,除了重新抛出:
该customException ( )创建一流的延伸旧的例外类。这样,它继承了所有方法和属性从旧的例外类
该errorMessage ( )函数创建。此函数返回一个错误信息,如果e - mail地址是无效的
美元的电子邮件变量设置为一个字符串,是一个有效的e - mail地址,但包含字符串“榜样”
的“尝试”块包含了一个“尝试”块,使其能够重新抛除
唯一的例外是引发自电子邮件包含字符串“榜样”
在“ catch ”块渔获量的例外和再抛出一个“ customException ”
该“ customException ”是捕获和显示错误讯息
如果例外的是没有抓住目前的“尝试”区块,它将寻求一个catch块的“更高水平” 。
-------------------------------------------------- ------------------------------
设置顶层异常处理
该set_exception_handler ( )函数设置一个用户定义的函数来处理所有uncaught例外。
<?php function myException($exception) { echo "Exception: " , $exception->getMessage(); }
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred'); ?>
输出如下.
Exception: Uncaught Exception occurred
在以上代码不存在“ catch ”块。相反,高层引发例外处理。此功能应该用来捕获uncaught例外。
规则的例外
代码可能是包围在try块,以帮助追赶潜力例外
每一个try块或“扔”必须至少有一个与之对应的catch
多个catch可以用来捕获不同的类的例外
例外可以扔(或重新抛出)在catch块在一个try块
一个简单的规则:如果你扔东西,你必须赶上它。