簡體   English   中英

在 try-catch 塊中繼續當前迭代 | PHP

[英]Continue with current iteration in a try-catch block | PHP

在我的腳本中,有時會出現服務器、連接、配置或 API 問題,因此我實現了一個 try-catch 塊來正確捕獲異常並跳過它們。

...但是我的問題並沒有用這個解決方案解決,因為元素(引發問題)不是問題本身。 所以基本上我的問題是是否有任何方法可以捕獲錯誤並從您離開的地方繼續:不跳過錯誤並轉到下一個元素,而是在 foreach 循環中重復當前迭代。

顯然,繼續中斷是行不通的!

foreach($xx as $x) {
    try {
        //main code
    } catch (Exception $e) {
        echo 'Caught exception: ', $e->getMessage(), "\n";
        sleep(10);
    }
}

...並且當 catch 部分捕獲錯誤時,代碼應該使用當前的 $x 重復 try 循環(它最初在其上捕獲錯誤/拋出錯誤),然后繼續處理元素列表。

您可以運行 for 循環而不是 foreach 循環,並且可以通過遞減它來管理 catch 塊內的增量計數器,以獲取當前的 $x(它最初在其上捕獲錯誤/拋出錯誤)並再次使用相同的元素重試。 它可能會導致無限循環,因此請保持任何重試閾值。

將 try 塊放入它自己的while (true)循環中,您可以在成功時break

while (true) {
    try {
        ...
        break;
    } catch (...) {
        ...
    }
}

這將重試相同的操作,直到沒有拋出異常。 為了避免永遠不會成功的操作的無限循環,您可以添加一個計數器,例如:

$tries = 0;
while ($tries < 10) {
    $tries++;
    try { ... }
}

一旦異常被拋出並被捕獲,就無法回到拋出異常的代碼塊。 不幸的是,沒有技術上的可能性,您只有一個 try catch 塊,您可以在其中捕獲所有異常,然后確定它們是否重要(並停止執行腳本)或者異常不是真正的問題,並且您希望您的腳本表現得像如果沒有例外。

我能給你的唯一解決方案是:

foreach($xx as $x) {
    try {
        //main code

        try {
            //first code that can cause an exception
            //you just want to continue after
        } catch (Exception $e) {
            echo "Nothing wrong, just an exception " . $e->getMessage(), "\n";
        }

        try {
            //second code that can cause an exception
            //a serious problem, you don't want to continue
        } catch (Exception $e) {
            echo "This is a real problem " . $e->getMessage(), "\n";
            throw $e; //re-trowing exception
        }

        //third code that can cause an exception

    } catch (Exception $e) {
        //will catch exception from code 2 and 3 but not 1.

        echo 'Caught exception: ', $e->getMessage(), "\n";
        sleep(10);
    }
}

順便提一句。 您要求的不是通過使用異常來完成,而是在出現錯誤的情況下完成。 如果發出錯誤信號,並且它是可恢復的,您可以為錯誤編寫一個全局處理程序,並在該錯誤句柄中決定錯誤是否是您要關閉腳本的問題,或者只是記錄它並返回腳本執行,就好像根本沒有錯誤。 但這是關於錯誤,而不是例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM