Puedo utilizar try-catch-finally como este?

Estoy usando try-catch durante años, pero nunca aprendí cómo y cuándo utilizar finally, porque nunca he entendido el punto de finally (he leído libros malos)?

Quiero preguntarle sobre el uso de finally en mi caso.

Mi ejemplo de código se debe explicar todo:

$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);
}

Es esto correcto uso de finalmente?

Más preciso en la pregunta:

Debo usar finally (en futuras versiones de PHP u otros lenguajes) para el manejo de «crear algo si no existe» operaciones?

stackoverflow.com/questions/927214/…
En el caso de que finalmente podría funcionar, pero no creo que la forma de usarlo es una buena práctica. Usted debe hacer todos los check necesario antes de usar una función
Así que para anser a su pregunta: «¿puedo utilizar finalmente para el manejo de «crear algo si no existe» operaciones?», Yo diría que no. Ver abajo cuando usted lo desea, puede utilizar finalmente.
No, es mucho no correcta. La cláusula Finally es para la limpieza, tales como el cierre de los identificadores de archivos, liberar memoria, etc. Realmente no se entiende para reintentar la operación. En el caso de que el original se realiza correctamente, usted termina la carga de los mismos datos dos veces, que es muy derrochador.

OriginalEl autor Kamil | 2013-02-22

4 Kommentare

  1. 31

    Finalmente siempre se ejecutará, por lo que en este caso, no es su finalidad, ya que la ejecución normal sería volver a abrir el archivo en un segundo tiempo. Lo que se pretende hacer se habría alcanzado en el mismo (limpiador) si no

    $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);
    }

    A continuación, el manual dice:

    Para el beneficio de alguien de quien no ha llegado finalmente a través de los bloques antes, la clave de la diferencia entre ellos y normal código siguiente en un bloque try/catch es que van a ser ejecutadas, incluso el bloque try/catch iba a devolver el control a la función de llamada.

    Se podría hacer esto si:

    • código si el bloque try contiene un tipo de excepción, que no te coja
    • tirar otra excepción en el bloque catch
    • su bloque try o catch llamadas de retorno

    Finalmente sería útil en este tipo de escenario:

    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();
        }
    }

    => si usted necesita para asegurarse de que usted cierre el archivo de controlador en este caso, o algunos de los recursos en general.

    realmente me gustó la sensación de ejemplo. Gracias 🙂
    Un vistazo más de cerca: aquí tienes una instrucción return en los bloques try y catch. Aún así, SERÁ finalmente ejecutado.
    así que esa es la diferencia! Muy grandes gracias. Finalmente reveló finally misterio para mí 🙂
    Una cosa más – cuando se ejecuta? antes de regresar? después de regresar? o hay varios subprocesos involucrados, y es por eso que no hay finally en PHP?
    son bienvenidos. Cuando el retorno se llama, finalmente va a ser ejecutado, luego de devolución se llevará a cabo. No el hilo involucrados.

    OriginalEl autor mika

  2. 4

    finally no fue introducido en PHP hasta la versión 5.5 que no ha sido publicado todavía, así que ¿por qué no has visto ninguna ejemplos con ella todavía. Así que a menos que usted está ejecutando y alfa de la versión de PHP 5.5 usted no puede utilizar finally todavía.

    Del manual (excepciones)

    En PHP 5.5 y versiones posteriores, de un bloque finally también puede ser especificado después de los bloques catch. El código dentro del bloque finally siempre se ejecuta después de que los bloques try y catch, independientemente de si se ha producido una excepción, y antes de la ejecución normal se reanuda.

    Ejemplo del manual de uso de finally

    <?php
    function inverse($x) {
        if (!$x) {
            throw new Exception('Division by zero.');
        }
        else return 1/$x;
    }
    
    try {
        echo inverse(5) . "\n";
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    } finally {
        echo "First finally.\n";
    }
    
    try {
        echo inverse(0) . "\n";
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    } finally {
        echo "Second finally.\n";
    }
    
    //Continue execution
    echo 'Hello World';
    ?>
    Que es derecho. Pero el ejemplo de la OP es una especie de corregir (me pregunto si la clase de excepción no debe estar encerrado entre paréntesis).
    Dicho esto, he aquí algunos ejemplos sobre cómo utilizar «finalmente»: wiki.php.net/rfc/finally de la wiki y athos.blogs.balabit.com/2011/02/try-catch-finally-in-php de Athos, que parece bueno para usted 🙂
    Alfa 5 fue lanzado el día de hoy 🙂
    puede usted pls help me > error > Fatal error: No se puede utilizar sin intentar atrapar o, finalmente, en C:\wamp\www\anusthana\andro.php en la línea 55 justpaste.es/74cqb @juan

    OriginalEl autor John Conde

  3. 0

    Finalmente significa lo que tu quieres hacer Finalmente.

    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
    }

    No importa lo que pase(independientemente de si se ha producido una excepción) dentro de try o catch, ‘Finalmente código se va a ejecutar.
    Así, no hay punto de usar el mismo código a través de ‘tratar’ y ‘por fin’.
    ¿Esto simplemente responder a su pregunta?

    «¿qué hacer, finalmente,» después de succesfuly de ejecución de bloque «catch»?
    Respuesta editado. Esperanza, me podría poner a este sencillo.
    la respuesta completa. Lo siento, si estoy equivocado 🙁
    Necesito una mejor explicación, pero +1 por tratar de ayudar.

    OriginalEl autor Mayukh Roy

  4. 0

    Sólo quiero nombrar que si se produce una Excepción en el try bloque, la excepción será correctamente planteado incluso si el finally bloque está presente.
    La utilidad de la finally bloque es para limpiar y liberar recursos.
    Creo que es mejor usar es cuando, por ejemplo, cargar un archivo pero entonces ocurre un error:

    $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
    }

    Como se puede ver, en este camino, sin importar lo que suceda, el archivo temporal se elimina correctamente.

    Si queremos emular el finally cláusula en la versión anterior de PHP, se debe escribir algo como esto:

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

    Tenga en cuenta que la excepción ha sido re-lanzado en caso de que el catch bloque cogido algo. No está claro como el finally versión, pero funciona de la misma.

    OriginalEl autor Iazel

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea