首页 > 编程笔记 > PHP笔记 阅读:22

PHP异常处理(Exception)入门教程

错误处理是编程中必须考虑的问题,我们需要写出健壮的代码来处理这些错误。

可以通过良好的编程经验减少代码业务逻辑中的错误,但若是出现网络超时、MySQLRedis 等其他服务连接失败,这样的错误是无法通过脚本控制的,那么你的代码中就要对这种可能出现的情况做容错处理,也就是本节要讲的异常处理。

异常处理是在一些可能发生错误的程序中抛出一个错误,以避免程序的中断执行,用户可捕获异常并做相应处理。因为在编写程序的过程中,很多情况下会发生一些未知的错误,比如接口返回数据的悲观预测、网络请求的延迟或断开、连接数据库失败等。

PHP 异常类 Exception

PHP 中提供了一个异常类 Exception,Exception 是所有异常类的基类。

Exception 类中的属性和方法如下:
Exception {
    /* 属性 */
    protected string $message ;
    protected int $code ;
    protected string $file ;
    protected int $line ;
    /* 方法 */
    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )
    final public string getMessage ( void )
    final public Exception getPrevious ( void )
    final public int getCode ( void )
    final public string getFile ( void )
    final public int getLine ( void )
    final public array getTrace ( void )
    final public string getTraceAsString ( void )
    public string __toString ( void )
    final private void __clone ( void )
}
关于该类中属性和方法的说明如下:

Exception 属性:

Exception 方法:


关于使用异常处理类的示例如下:
<?php
error_reporting(0);  //设置错误级别为0, 不报错
function theDatabaseObj(){
    $mysql = mysqli_connect('127.0.0.1', 'c_biancheng_net', '12345678', '3306');
    if( $mysql ){
        return $mysql;
    } else {
        throw new Exception("Could not connect to the database");
    }
}
function db(){
    try{
        $db = theDatabaseObj();
        var_dump($db);
    } catch ( Exception $e ) {
        echo $e->getMessage();
    }
}
db();
?>
保存并执行以上代码,打印结果为:

Could not connect to the database

在以上示例中,在 db() 函数中调用 theDatabaseObj() 函数,在 theDatabaseObj() 函数中,如果成功连接到数据库就返回数据库实例,否则抛出一个异常,在 db() 函数中捕获异常。

执行以上代码,若打印出字符串“Could not connect to the database”,则说明连接数据库失败,我们捕获了这个异常。

PHP 创建自己的异常类

在各种语言里,对异常和错误的定义不同。在 PHP 里遇到任何错误都会抛出一个错误,很少会主动抛出异常,不像 Java 语言那样会预先定义好各种异常类,当程序执行到异常处的代码时会主动抛出。

PHP 的异常处理机制并不完善,在 PHP 中想处理不可预料的异常是办不到的,必须事先定义一些异常,将各种可能出现的异常进行 if…else 判断,手动抛出异常,所以在 PHP 里经常会使用到我们自己创建的异常类。

下面定义两个异常类,都继承自 Exception 基类。
class emailException extends Exception{
    function __toString(){
        return "<b>email is null</b>file:".$this->getFile().',line:'. $this->getLine();
    }
}
class nameException extends Exception{

}

在实际业务中可根据不同需求抛出不同异常,业务代码如下:
function reg($reg) {
    if (empty($reg['email'])) {
        throw new emailException("emaill is null", 1);
    }
    if(empty($reg['name'])) {
        throw new nameException("name is null", 2);
     }
}

在执行业务代码时,需要使用 if 语句判断异常会发生的地方,然后手动抛出异常,将不同的异常分发给不同的异常类处理,如下所示:
try{
    $reg = array('phone'=>'1888888888');
    reg($reg);
} catch(emailException $e) {
    echo $e;
} catch(nameException $e) {
    echo 'error msg:' .$e->getMessage().'error code:'.$e->getCode();
} finally {
    echo ' finally';
}
这段程序根据不同的情况捕获不同的异常,如果第一个 catch 捕获了异常,即使程序中仍然存在其他异常,也会跳过其他的 catch 代码块,但是不管程序中是否出现异常,最终 finally 中的语句都会执行。

执行以上程序的结果为:    

email is null file:/Library/WebServer/Documents/book/try.php,line:39 finally

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注

所有教程

优秀文章