查詢

Fiber::throw()函式—用法及示例

「 在協程中丟擲異常 」


函式名:Fiber::throw()

適用版本:PHP 8.1.0 及以上版本

用法:Fiber::throw() 函式用於在協程中丟擲異常。它會中斷當前協程的執行,並將異常傳遞到協程的呼叫者。

示例:

<?php
function taskA() {
    echo "Task A started\n";
    $fiber = Fiber::getCurrent();
    
    try {
        // 執行一些任務
        // ...
        
        // 丟擲異常
        Fiber::throw(new Exception("Something went wrong"));
        
        // 這行程式碼將不會被執行
        echo "Task A completed\n";
    } catch (Exception $e) {
        echo "Caught exception: " . $e->getMessage() . "\n";
    }
    
    echo "Task A finished\n";
}

function taskB() {
    echo "Task B started\n";
    $fiber = new Fiber('taskA');
    $fiber->start();
    
    // 捕獲 taskA 中丟擲的異常
    try {
        while ($fiber->status() !== Fiber::STATUS_FINISHED) {
            $fiber->resume();
        }
    } catch (Exception $e) {
        echo "Caught exception from taskA: " . $e->getMessage() . "\n";
    }
    
    echo "Task B completed\n";
}

taskB();
?>

輸出:

Task B started
Task A started
Caught exception: Something went wrong
Task A finished
Task B completed

在上面的示例中,我們定義了兩個協程函式 taskA()taskB()taskB() 啟動了 taskA() 的協程,並在 while 迴圈中透過 resume() 方法來執行 taskA() 協程的程式碼。當 taskA() 中丟擲異常時,它會被 taskB() 中的 catch 語句捕獲到,並輸出異常資訊。然後,taskB() 繼續執行剩餘的程式碼。

請注意,Fiber::throw() 只能在當前協程中丟擲異常,如果在非協程環境中呼叫該函式,會丟擲 FiberError 異常。

補充糾錯
上一個函式: Fiber::__construct()函式
下一個函式: Fiber::suspend()函式
熱門PHP函式
分享連結