小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-03-21 / 26 阅读
0
0

php 异常处理 预测并控制潜在错误行为的代码 try{}catch{}finally{}

try-catch 是编程语言中异常处理机制的一部分,特别是在像 PHP 这样的支持异常处理的语言中。它允许程序员编写能够预测并控制潜在错误行为的代码,而不是让程序在遇到错误时立即崩溃。

基本概念:

  1. try 块:

    • try 块包裹了可能会引发异常的代码段。当你预计这段代码有可能会发生某种类型的错误(即抛出异常)时,将其放在 try 代码块内。
    • 使用try{}catch{}捕获异常,如果过程中出错后面将不再执行直接抛入catch中
    try {
        // 这里放置可能发生异常的代码
        $resource = openSomeResourceThatMightFail();
        // ... 其他可能抛出异常的操作 ...
    }
    
  2. catch 块:

    • catch 块紧跟在 try 块之后,用于捕获并处理在 try 块中抛出的异常。
    • try 块中的代码抛出一个异常时,控制权会立即转移到第一个能匹配此异常类型的 catch 块。
    • catch 块中,你可以访问异常对象以获取异常的信息,如错误消息、错误代码等。
    catch (ExceptionType $exceptionVariable) {
        // 这里处理捕获到的异常
        echo "An exception occurred: " . $exceptionVariable->getMessage();
        // ... 更多错误处理逻辑 ...
    }
    
  3. 多个 catch 块:

    • 可以有多个 catch 块,每个 catch 分别捕获不同类型的异常,或者有一个通用的 Exception 类型来捕获所有未特别指定的异常。
  4. finally 块(可选):

    • 在一些编程语言(包括PHP 5.5及更高版本)中,还可以添加 finally 块,它会在 trycatch 执行完后(无论是否抛出异常)始终被执行。
    • 这个块通常用于资源清理工作,比如关闭文件、数据库连接等。
    finally {
        // 这里的代码无论是否抛出异常都会执行
        closeSomeResource();
    }
    

完整示例:

try {
    // 尝试执行可能抛出异常的操作
    $dbConnection = new mysqli('host', 'user', 'pass', 'db');
    $result = $dbConnection->query('SELECT * FROM non_existent_table');
} catch (mysqli_sql_exception $e) {
    // 如果查询失败(如表不存在),捕获特定的SQL异常
    echo "SQL Error: " . $e->getMessage();
} catch (Exception $e) {
    // 如果发生了其他类型的异常,也捕获并处理
    echo "General Error: " . $e->getMessage();
} finally {
    // 不管有没有异常,最后都要关闭数据库连接
    if ($dbConnection !== null) {
        $dbConnection->close();
    }
}

在上述例子中,如果尝试查询一个不存在的表时,mysqli_query() 方法会抛出一个异常。catch 块会捕获这个异常,并显示有关错误的消息。不论是否有异常发生,finally 块都会执行,确保数据库连接正确关闭。

PDO连接演示:

 try{
            $pdo = new PDO($dsn, $username, $password);
            //将PDO错误模式设置为异常
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        }catch(PDOException $error){
            throw new Exception(die("Connection failed: " . $error->getMessage()));   
        }
    }
}

这段代码是PHP中用于创建和配置PDO(PHP Data Objects)数据库连接的片段,它通过try-catch结构处理可能出现的错误。$error 是一个对象。在 PHP 中,当你尝试捕获一个异常时(使用 catch (Exception $error)),$error 就会成为一个异常对象的引用,这个对象通常是 Exception 类或其子类的实例。

在代码段中:

catch(PDOException $error){
    throw new Exception(die("Connection failed: " . $error->getMessage()));
}
  1. try块:

    • $pdo = new PDO($dsn, $username, $password);:这一行创建了一个新的PDO对象实例,用于与数据库建立连接。其中​dsn是一个包含数据源名称、数据库类型、主机名、数据库名等信息的字符串,而username和$password则是用于登录数据库的用户名和密码。
    • $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);:这一行设置了PDO的错误模式为异常模式,也就是说,如果在执行SQL语句时发生错误,PDO会抛出一个PDOException异常,而不是返回错误代码。
  2. catch(PDOException $error)块:

    • 当在try块中的代码出现PDOException异常时,程序会跳转到catch块执行。
    • throw new Exception(die("Connection failed: " . $error->getMessage()));:在catch块中,捕获到的PDOException对象赋值给​error变量,然后通过`error->getMessage()`获取具体的错误信息,并构造一个新的Exception异常并抛出。这里使用了die函数终止脚本执行并输出错误信息,但这种方式并不推荐在抛出自定义异常时使用,因为die会立即停止脚本运行,而抛出异常可以被上层代码捕获并进行更灵活的错误处理。
    • $error 是一个 PDOException 类型的对象,它是 PHP 中用于处理 PDO 数据库操作异常的类。通过 $error->getMessage(),你可以访问并获取与该异常相关的具体错误信息,这通常是一个描述错误情况的字符串。

    在PHP中,throw new Exception 是用于抛出一个用户自定义的异常情况的语句。这里的 Exception 是 PHP 内置的一个基础异常类,所有其他的异常类都继承自此类。

    具体语法格式如下:

    throw new Exception([message[, code]]);
    
    • message(可选):这是一个字符串,用于描述异常的具体情况。当你捕获到这个异常时,可以通过 getMessage() 方法获取这个消息内容,以便了解发生了什么错误或异常状况。
    • code(可选):这是一个整数,表示异常的错误代码。它可以用来区分不同类型的异常或错误,也可以在捕获异常时通过 getCode() 方法获取。

    new关键字在面向对象编程(OOP)中用于创建一个类的新实例(对象)。当你看到 new Exception(...)时,这意味着你正在创建一个新的 Exception对象。

    在PHP中,new Exception([message[, code]])的过程包括以下步骤:

    1. 分配内存:new关键字指示PHP引擎分配足够的内存空间来存储一个 Exception类实例的数据成员(属性)。
    2. 调用构造函数:Exception类有一个默认的构造函数(如果没有自定义构造函数的话),当使用 new创建对象时,会自动调用这个构造函数。构造函数可以接收参数,如错误消息(message)和错误代码(code),用于初始化异常对象的状态。
    3. 初始化对象:构造函数执行完毕后,对象就初始化好了,此时你可以使用这个 Exception对象来进行各种操作,比如抛出异常(throw关键字)。

    举例说明:

    // 创建一个Exception对象,并设置错误消息
    $exception = new Exception('This is an error message.');
    
    // 抛出这个异常
    throw $exception;
    

    在这个例子中,new Exception('This is an error message.')创建了一个带有特定错误消息的异常对象。当抛出此异常时,程序控制流将立即跳转到最近的匹配 catch块,如果找不到这样的块,程序将终止执行并显示错误消息。

    示例:

    try {
        if (someConditionIsNotMet()) {
            throw new Exception("A specific condition is not met.", 1001);
        }
    } catch (Exception $error) {
        echo "Error message: " . $error->getMessage();
        echo "Error code: " . $error->getCode();
    }
    

    在这个例子中,当某个特定条件未满足时,会抛出自定义异常。然后,在 catch 块中捕获这个异常,并输出相应的错误消息和错误代码。通过这种方式,程序员可以控制程序在遇到特定错误或异常情况时的行为,确保程序的健壮性和容错性。

理想情况下,catch部分应该改为仅抛出异常并提供错误信息,如下所示:

catch(PDOException $error) {
    throw new Exception("Connection failed: " . $error->getMessage());
}

​error可更改为其他$error是一个已经实例化的对象getMessage()是他的一个方法

这样,当数据库连接失败时,程序会抛出一个自定义的Exception异常,包含详细的错误信息,且不会立即终止脚本执行,使得上层调用能够对这个异常进行进一步处理。


评论