2

そのため、関数がクラッシュすることがあり(キャッチされない例外)、1秒の遅延で発生したときに2回呼び出し直したいとします。これがコードですが、機能していないようです:

$crashesn = 0;

function checkNum($number) {
    echo $number . "<br>";
    if ($number>1) {
        throw new Exception("Value must be 1 or below");
    }
    return true;
}

try {
    checkNum(2);
    echo 'If you see this, the number is 1 or below';
}

catch(Exception $e) {
    $crashesn++;
    echo "crashes number:".$crashesn."<br>";
    if ($crashesn <= 2) {
        sleep(1);
        checkNum(2);
    } else {
        echo "MESSAGE: " .$e->getMessage();
    }
}

checknumは、例外をスローする関数です(ここでは、例外をスローするたびにクラッシュします)。問題は、このコードを実行しても、ページにエラーメッセージが表示されることです。

Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in G:\fix\ta_dll\test.php:30 Stack trace: #0 c:\wwwl\test.php(45): checkNum(2) #1 {main} thrown in c:\php\test.php on line 30

「メッセージ:エラーの説明」の代わりに。「クラッシュ番号」の行は、2回ではなく、1回だけ印刷されます。

誰かが私が間違っていることを知っていますか?

4

5 に答える 5

9

代わりにループを試してください

for ($crashes = 0; $crashes < 3; $crashes++) {
    try {
        checkNum(2);
        echo 'If you see this, the number is 1 or below';
        break;
    }
    catch(Exception $e) {
        echo "crashes number:" . $crashes . "<br>";
        if ($crashes < 2) {
            sleep(1);
        } else {
            echo "MESSAGE: " . $e->getMessage();
        }
    }
}

適切にcheckNum()戻ると、for ループは中断されたままになります。それ以外の場合、例外がスローされると、break がスキップされ、ループが繰り返されます。

于 2012-12-13T08:18:29.323 に答える
3

あなたのコメントからit crashes sometimes (due to memory leaks i guess). So I need to auto-repeat it 2 or 3 more times when the crash happens.

解決策 1 : gotoを使用してみてください...古い学校であり、 になる可能性がありますが、うまくいく可能性があります

$crashesn = 0;
START:
try {
    checkNum(2);
    echo 'If you see this, the number is 1 or below';
    break;
} catch ( Exception $e ) {
    $crashesn ++;
    echo "crashes number:" . $crashesn . "<br>";
    if ($crashesn <= 2) {
        sleep(1);
        goto START;
    } else {
        echo "MESSAGE: " . $e->getMessage();
    }
}

解決策 2:ループを使用するだけで、php での try-catch のパフォーマンスも読み取ることができます

$crashesn = 0;
do {
    try {
        checkNum(2);
        echo 'If you see this, the number is 1 or below';
    } catch ( Exception $e ) {
        $crashesn ++;
        echo "crashes number:" . $crashesn . "<br>";
        if ($crashesn <= 2) {
            sleep(1);
        } else {
            echo "MESSAGE: " . $e->getMessage();
        }
    }
} while ( $crashesn <= 2 );

どちらも出力されます

2
crashes number:1
2
crashes number:2
2
crashes number:3
MESSAGE: Value must be 1 or below
于 2012-12-13T08:22:40.903 に答える
2

私のコメントに加えて: なぜ例外をスローしているのですか? 数値が 1 より大きい場合、例外がスローされます。例外を削除して、次のようなものを使用します。

function checkNum($number) {
    echo $number . "<br>";
    if ($number>1) {
        return false;
    }
    return true;
}

$crashesn = 0;
$number = 2; // number from somewhere.
$failed =false;
while (!$checkNum($number)){
  echo $number." is to large!";
  $crashesn++;

  if ($crashesn > 2){
     //stop retrying it.
     $failed = true;
     break;
  }
}

if (!$failed){
   echo $number." is valid";
}else{
   echo "Failed after 2 retries";
}

ただし、番号が「固定」値の場合、呼び出しを繰り返す意味はありません。3 回失敗するか、最初の実行で有効になります。

例外は重大なエラーです。通常の論理式で処理できるものを検証するためにそれらを使用しないでください。

于 2012-12-13T08:24:28.180 に答える
1
$checked = false;
while ($i < 3 && $checked === false){
    try{
        $checked = checkNum($number);
    }
    catch(Exception $e){
        $i++;
    }
}
于 2012-12-13T08:24:07.617 に答える
1

あなたの catch では、別の try catch が必要です

try {

          // some code here
   }
    catch(Exception $e) {

          try {
            $crashesn++;
            echo "crashes number:".$crashesn."<br>";
            if ($crashesn <= 2) {
                sleep(1);
                checkNum(2);
            } 

          }
          catch(Exception $e) {

            echo "MESSAGE: " .$e->getMessage();
          }

   }
于 2012-12-13T08:16:10.800 に答える