3

finally節をシミュレートするためのベストプラクティスは何ですか?これは、この質問に関連していると見なすことができると思います(重複しているとは思いませんが)。

ただし、私の場合、例外を処理したいので、pythonで定義されているようにfinally(または同等のPHPまたはプラクティス)を使用します。

例外が発生したかどうかに関係なく、finally句は常にtryステートメントを終了する前に実行されます。

try-catchブロックの後にコードを大まかに書くことは、私には醜い習慣のように思えます。

4

4 に答える 4

8

最終的に PHP に追加するためのRFC では、次の回避策が提案されています。

<?php
$db = mysqli_connect();
try {
   call_some_function($db);
} catch (Exception $e) {
   mysqli_close($db);
   throw $e;
}
mysql_close($db);

そのため、PHP 5.5 (この構造が含まれる予定finally) にアップグレードしない限り、これがおそらく最良の選択肢です。

于 2013-03-12T19:32:07.450 に答える
5

これは答えのないものと見なされる可能性がありますがfinally、「RAII パターン」(「Resource Acquisition Is Initialization」) のように、リソースのクリーンアップがデストラクタで行われるなど、不要なコードを構造化する方法があります。そのリソースを表すローカル スコープの変数。

例外によって関数のスコープから外れると、デストラクタが起動するため、クリーンアップが期待どおりに行われるという考え方です。例外がスローされない場合、関数の最後に到達し、変数はそのように範囲外になります。

簡単な Google は、任意のコールバックでそれを行うためのこの単純なコードを見つけました。

于 2013-03-12T19:50:52.453 に答える
2

PHP 5.5 以降には、finallyコンストラクトがあります。

ドキュメントから:

try {
    echo inverse(5) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} finally {
    echo "First finally.\n";
}
于 2013-03-12T19:32:47.260 に答える
0

5.5 より前のレガシー コードの維持にまだ行き詰まっていて、呼び出しごとに必須の偽のスローのオーバーヘッドを気にしない場合は、常にこの汚い小さなトリックがあります。

try { 
     // do your worst to mess things up.

     throw new Exception("finally");
} catch (Exception $e) {
    //TODO: after upgrading to 5.5, make this a legit try/catch/finally
    if ( ($msg = $e->getMessage())  != "finally"){
        // real catch
        echo "Exception doing something :" . $msg;
    } else {
        // quasi finally.
    };
}
于 2016-05-30T13:45:15.480 に答える