15

私は何年も使っていますが、 (悪い本を読んだことがある)のポイントがわからなかったので、try-catchいつどのように使うかを学びませんでしたか?finallyfinally

私の場合の使用についてお聞きしたいのですがfinally

私のコード例はすべてを説明する必要があります:

$s = "";

$c = MyClassForFileHandling::getInstance();

try
{
    $s = $c->get_file_content($path);
}

catch FileNotFoundExeption
{
    $c->create_file($path, "text for new file");
}

finally
{
    $s = $c->get_file_content($path);
}

これはfinallyの正しい使用法ですか?

より正確な質問:

finally「存在しない場合は何かを作成する」操作を処理するために(将来のPHPバージョンまたは他の言語で)使用しますか?

4

4 に答える 4

31

最後に常に実行されるため、この場合、通常の実行ではファイルが再度開かれるため、意図した目的ではありません。あなたがやろうとしていることは、あなたがやれば同じ(よりクリーンな)方法で達成されるでしょう

$s = "";

$c = MyClassForFileHandling::getInstance();

try
{
    $s = $c->get_file_content($path);
}
catch(FileNotFoundExeption $e)
{
    $c->create_file($path, "text for new file");
    $s = $c->get_file_content($path);
}

次に、マニュアルには次のように書かれています。

これまでfinallyブロックに遭遇したことがない人のために、try / catchブロックに続く通常のコードとの主な違いは、try/catchブロックが呼び出し元の関数に制御を戻す場合でも実行されることです。

次の場合にこれを行う可能性があります。

  • tryブロックにキャッチしない例外タイプが含まれている場合のコード
  • キャッチブロックで別の例外をスローします
  • tryまたはcatchブロック呼び出しが返されます

最後に、この種のシナリオで役立ちます。

function my_get_file_content($path)
{
    try
    {
        return $c->get_file_content($path);
    }
    catch(FileNotFoundExeption $e)
    {
        $c->create_file($path, "text for new file");
        return $c->get_file_content($path);
    }
    finally
    {
        $c->close_file_handler();
    }
}

=>この場合、ファイルハンドラー、または一般的なリソースを確実に閉じる必要がある場合。

于 2013-02-22T19:32:34.543 に答える
0

tryブロックで例外が発生した場合、ブロックが存在していても例外が正しく発生することを指定したいだけですfinally。ブロックの有用性はfinally、クリーンで無料のリソースです。たとえば、ファイルをアップロードした後にエラーが発生した場合に最適な使用法だと思います。

$tmp_name = null;
try {
    $tmp_name = tempnam(UPLOAD_DIR, 'prefix');
    move_uploaded_file($file['tmp_name'], $tmp_name);
    ImageManager::resize($tmp_name, $real_path, $width, $height); // this will rise some exception
}
finally {
    if($tmp_name)
        unlink($tmp_name); // this will ensure the temp file is ALWAYS deleted
}

ご覧のとおり、このようにして、何が起こっても一時ファイルは正しく削除されます。
古いバージョンの PHP で句をエミュレートする場合はfinally、次のように記述します。

// start finally
catch(Exception $ex) {
}
if($tmp_name)
    unlink($tmp_name);
if( isset($ex) )
    throw $ex;
// end finally

catchブロックが何かをキャッチした場合に備えて、例外が再スローされていることに注意してください。finallyバージョンとしては明確ではありませんが、同じように動作します。

于 2014-11-30T17:17:44.313 に答える
0

最終的には、最終的に何をしたいかを意味します。

try
{
    $s = $c->get_file_content($path);
}

catch FileNotFoundExeption
{
    $c->create_file($path, "text for new file");
}

finally
{
    //Create a pdf with my file
    //or, Rename my file
    //or, store my file into Database
}

try または catch 内で何が起こっても (例外がスローされたかどうかに関係なく)、'Finally code' が実行されます。したがって、'try' と 'finally' で同じコードを使用しても意味がありません。これは単にあなたの質問に答えていますか?

于 2013-02-22T19:13:26.563 に答える