您好,UncleToo欢迎您!  为了更好的浏览本站,请使用高版本浏览器
RSS  Tag     设为首页 | 加入收藏
 您所在的位置:首页 > PHP技术 > PHP基础

PHP教程:PHP异常处理---try{...}catch{...}使用详解

作者:UncleToo  来源:转载  日期:2016-02-16 21:02:41
收藏  评论:( 0 )  阅读:426

一、异常处理的概念

异常处理(又称为错误处理)功能提供了处理程序运行时出现的错误或异常情况的方法。

PHP 5 提供了一种新的面向对象的错误处理方法。可以使用检测(try)、抛出(throw)和捕获(catch)异常。即使用try检测有没有抛出(throw)异常,若有异常抛出(throw),使用catch捕获异常。

一个 try 至少要有一个与之对应的 catch。定义多个 catch 可以捕获不同的对象。PHP 会按这些 catch 被定义的顺序执行,直到完成最后一个为止。而在这些 catch 内,又可以抛出新的异常。

二、异常处理内置类Exception

首先PHP为异常处理提供了一个内置类-Exception,其定义如下所示:

class Exception
{
protected $message = 'Unknown exception';   // 异常信息
protected $code = 0;                        // 用户自定义异常代码
protected $file;                            // 发生异常的文件名
protected $line;                            // 发生异常的代码行号
function __construct($message = null, $code = 0);
final function getMessage();                // 返回异常信息
final function getCode();                   // 返回异常代码
final function getFile();                   // 返回发生异常的文件名
final function getLine();                   // 返回发生异常的代码行号
final function getTrace();                  // backtrace() 数组
final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息
/* 可重载的方法 */
function __toString();                       // 可输出的字符串
}

可以看到其构造函数需要两个参数:message和code
1. message为用户自定义的错误信息,需用双引号" "括起
2. code为用户自定义的错误代码号

三、异常的使用

当一个异常被抛出时,其后的代码将不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。如果一个异常没有被捕获,而且又没用使用set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出未能捕获异常(Uncaught Exception … )的提示信息。

3.1、测试1

<?php
try{
if(1==1)
{
throw new Exception("aaa<br/>",10086);
}
echo "bbb";
}
catch (Exception $e){
echo "错误代码:".$e->getCode()."错误信息:".$e->getMessage();
}
echo "ddd";
?>

使用如上测试代码,输出结果为

错误代码:10086错误信息:aaa
ddd

说明当1==1时也即可判断一个条件为真时,进入if语句中,通过throw抛出一个异常,并跳过了try中该throw语句后面的所有代码(只跳过了try语句中的代码,不是后面所有的代码),接着catch获取这个异常并定义了一个$e读取这个异常,通过调用内置类的两个函数getCode()和getMessage()可获取相应的异常信息(也可调用其他函数获取其他信息),接着继续执行后面的代码


3.2、测试2

<?php
try{
if(1==2)
{
throw new Exception("aaa<br/>",10086);
}
echo "bbb";
}
catch (Exception $e){
echo "错误代码:".$e->getCode()."错误信息:".$e->getMessage();
}
echo "ddd";
?>

使用如上测试代码,输出结果为

bbbddd

未在try语句中进入if语句,也即未抛出异常,catch语句不会被执行,只按顺序输出bbbddd

四、自定义异常处理类

如果使用自定义的类来扩展内置异常处理类,并且要重新定义构造函数的话,建议同时调用 parent::__construct() 来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载__toString() 并自定义输出的样式。
构建自定义异常处理类:

<?php
/**
*
* 自定义一个异常处理类
*/
class MyException extends Exception
{
// 重定义构造器使 message 变为必须被指定的属性
public function __construct($message, $code = 0) {
// 自定义的代码
// 确保所有变量都被正确赋值
parent::__construct($message, $code);
}
// 自定义字符串输出的样式 */
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "A Custom function for this type of exception\n";
}
}
// 例子 1:抛出自定义异常,但没有默认的异常
echo ' 例子 1', '<br>';
try {
// 抛出自定义异常
throw new MyException('1 is an invalid parameter', 5);
} catch (MyException $e) {      // 捕获异常
echo "Caught my exception\n", $e;
$e->customFunction();
} catch (Exception $e) {        // 被忽略
echo "Caught Default Exception\n", $e;
}
// 执行后续代码
// 例子 2: 抛出默认的异常  但没有自定义异常
echo '<br>', ' 例子 2:', '<br>';
try {
// 抛出默认的异常
throw new Exception('2 isnt allowed as a parameter', 6);
} catch (MyException $e) {      // 不能匹配异常的种类,被忽略
echo "Caught my exception\n", $e;
$e->customFunction();
} catch (Exception $e) {// 捕获异常
echo "Caught Default Exception\n", $e;
}
// 执行后续代码
// 例子 3: 抛出自定义异常 ,使用默认异常类对象来捕获
echo '<br>', ' 例子 3:', '<br>';
try {
// 抛出自定义异常
throw new MyException('3 isnt allowed as a parameter', 6);
} catch (Exception $e) {        // 捕获异常
echo "Default Exception caught\n", $e;
}
// 执行后续代码
// 例子 4
echo '<br>', ' 例子 4:', '<br>';
try {
echo 'No Exception ';
} catch (Exception $e) {        // 没有异常,被忽略
echo "Default Exception caught\n", $e;
}
?>
// 执行后续代码

MyException 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法,我们可以使用 exception 类的方法,比如 getLine() 、 getFile() 以及 getMessage()。

原文地址:http://blog.csdn.net/qq_25077833/article/details/50676590



除非特别声明,本站所有PHP教程及其他教程/文章均为原创、翻译或网友投稿,版权均归UncleToo中文网所有, 转载请注明作者及出处。
原文网址:http://www.uncletoo.com/html/base/1151.html
读完这篇文章后,你是否有所收获? 分享是一种生活的信念!
  • 0
  • 0
我来说两句
更多>>网友评论