2010-07-29 8 views
14

¿Hay algo similar en PHP al try ... else en Python?php try ... else

Necesito saber si el bloque try se ejecutó correctamente, como cuando el bloque se ejecutó correctamente, se imprimirá un mensaje.

Respuesta

-1

Puede usar try { } catch() { } y throw. Ver http://php.net/manual/en/language.exceptions.php

try { 
    $a = 13/0; // should throw exception 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

o manualmente:

try { 
    throw new Exception("I don't want to be tried!"); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 
+0

¿Desea explicar el voto a favor? ¿He cometido un error? – MvanGeest

+2

No perdoné, pero me preguntó sobre el bloque 'else', no excepciones en general ... – ircmaxell

+0

Ah, y '$ a = 13/0;' no lanzará una excepción a menos que tenga un controlador de errores instalado que arroje excepciones ('set_error_handler (function ($ errno, $ errstr, $ errfile, $ errline) {throw new ErrorException ($ errstr, 0, $ errno, $ errfile, $ errline);}); '... http://www.php.net/manual/en/class.errorexception.php) – ircmaxell

-1

Hay es try-catch en php.

Ejemplo:

function inverse($x) { 
    if (!$x) { 
     throw new Exception('Division by zero.'); 
    } 
    else return 1/$x; 
} 

try { 
    echo inverse(5) . "\n"; 
    echo inverse(0) . "\n"; 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

// Continue execution 
echo 'Hello World'; 
+0

La pregunta era sobre php equivalente a "try-else" de Python, que es tener una forma compacta de ejecutar un bloque de código después del bloque try cuando no se lanza ninguna excepción. – vokimon

40

PHP no tiene try/catch/persona. sin embargo, puede establecer una variable en el bloque catch que se puede utilizar para determinar si se ha ejecutado:

$caught = false; 

try { 
    // something 
} catch (Exception $e) { 
    $caught = true; 
} 

if (!$caught) { 

} 
+0

Esto se llena de sentencias '$ caught = true;' si hay varios bloques 'catch'. – Artefacto

+0

Pero así es como funciona el python 'else' también. – webbiedave

+2

Una nota menor, el bloque else de Python solo se ejecutará si '$ caught' es falso, no es cierto ... – ircmaxell

0
try { 
    $clean = false; 
    ... 
    $clean = true; 
} catch (...) { ... } 

if (!$clean) { 
    //... 
} 

eso es lo mejor que puede hacer.

+0

Debe establecer $ clean en su valor inicial antes de ingresar al bloque try..catch. Vea la respuesta de webbiedave. – jmz

+0

@jmz Hum? ¿Por qué? es indiferente; no hay alcance de bloque en PHP. – Artefacto

4

Creo que la cláusula "else" es un poco limitante, a menos que no le importen las excepciones que se lanzan allí (o si quiere saltear esas excepciones) ... Desde mi entendimiento de Python, es básicamente el equivalente de esto:

try { 
    //...Do Some Stuff Here 
    try { 
     // Else block code here 
    } catch (Exception $e) { 
     $e->elseBlock = true; 
     throw $e; 
    } 
} catch (Exception $e) { 
    if (isset($e->elseBlock) && $e->elseBlock) { 
     throw $e; 
    } 
    // catch block code here 
} 

así que es un poco más de detalle (ya que se necesita para volver a lanzar las excepciones), sino que también se propaga hacia arriba de la pila de la misma que la cláusula else ...

Editar O bien, una versión más limpia (solo 5.3)

class ElseException extends Exception(); 

try { 
    //...Do Some Stuff Here 
    try { 
     // Else block code here 
    } catch (Exception $e) { 
     throw new ElseException('Else Clasuse Exception', 0, $e); 
    } 
} catch (ElseException $e) { 
    throw $e->getPrevious(); 
} catch (Exception $e) { 
    // catch block code here 
} 

Editar 2

Vuelva a leer su pregunta, creo que se le puede complicar las cosas con un bloque "si no" ... Si acaba de impresión (que no es probable que lanzar una excepción), que realmente no necesita un bloque else:

try { 
    // Do Some stuff 
    print "Success"; 
} catch (Exception $e) { 
    //Handle error here 
    print "Error"; 
} 

ese código sólo alguna vez imprimir ya seaSuccess o Error ... Nunca tanto (ya que si la función print produce la excepción, que ganó' t ser realmente impreso ... Pero no creo que el print PUEDE lanzar excepciones ...).

+0

En mi caso, funcionó bien poniendo el próximo 'try {}' dentro de 'catch {}' – Pathros

+0

@ircmaxell Su respuesta "Editar 2" es una buena respuesta. Tal vez publicarlo como una respuesta separada para que pueda votarse por sí mismo. – Beetle

Cuestiones relacionadas