2013-06-25 24 views
17

Considerare questi due esempiQual è la parola chiave `finally` per in PHP?

<?php 
function throw_exception() { 
    // Arbitrary code here 
    throw new Exception('Hello, Joe!'); 
} 

function some_code() { 
    // Arbitrary code here 
} 

try { 
    throw_exception(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

some_code(); 

// More arbitrary code 
?> 

e

<?php 
function throw_exception() { 
    // Arbitrary code here 
    throw new Exception('Hello, Joe!'); 
} 

function some_code() { 
    // Arbitrary code here 
} 

try { 
    throw_exception(); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} finally { 
    some_code(); 
} 

// More arbitrary code 
?> 

Qual è la differenza? C'è una situazione in cui il primo esempio non eseguirà some_code(), ma il secondo sarebbe? Mi manca completamente il punto?

+4

'codice all'interno del blocco finally verrà sempre eseguita dopo i blocchi try e catch, indipendentemente dal fatto che l'eccezione è stato gettato, e prima che la normale esecuzione resumes.' –

+0

Penso che questo è legato a questa discussione: http://stackoverflow.com/questions/15031515/can-i-use-try-catch-finally-like-this – JunM

+0

Solo per salvare chiunque altro copia-incolla dal manuale PHP, ho letto che ma non capire la differenza tra questi due esempi, altrimenti non avrei fatto la domanda. – marxjohnson

risposta

37

Se si cattura l'eccezione (qualsiasi eccezione) i due esempi di codice sono equivalenti. Ma se si gestisce solo un tipo di eccezione specifico nel blocco di classe e si verifica un altro tipo di eccezione, allora some_code(); verrà eseguito solo se si dispone di un blocco finally.

try { 
    throw_exception(); 
} catch (ExceptionTypeA $e) { 
    echo $e->getMessage(); 
} 

some_code(); // Will not execute if throw_exception throws an ExceptionTypeB 

ma:

try { 
    throw_exception(); 
} catch (ExceptionTypeA $e) { 
    echo $e->getMessage(); 
} finally { 
    some_code(); // Will be execute even if throw_exception throws an ExceptionTypeB 
} 
+1

Vale la pena un +1 per la citazione di un'istanza specifica quando 'some_code()' non verrà eseguito –

+0

Molto chiaro e utile ... –

+0

Ho passato un po 'di tempo a cercare perché sono utili e, infine, non è previsto il gioco di parole, la tua risposta fornisce un valido ragionamento per la necessità di un blocco finale. –

-1

http://www.youtube.com/watch?v=EWj60p8esD0

Watch da: 12:30 in poi

Guarda questo video. Tuttavia, la lingua è JAVA. Ma penso che illustri Eccezioni e l'uso della parola chiave finalmente molto bene.

+0

Grazie soden, questo spiega quello che so già, cioè che funziona indipendentemente da se c'è un'eccezione. Ma così fa il codice posto dopo il blocco, vero? C'è un vantaggio specifico per averlo come parte del blocco? – marxjohnson

+0

Dipende da quanto si desidera che l'eccezione venga astratta dall'utente. Parlare in generale usando finalmente è una rarità. – sodhancha

0

fianlly blocco viene utilizzato quando si vuole un pezzo di codice da eseguire indipendentemente dal fatto che si è verificata un'eccezione o no ...

Partenza Esempio 2 in questa pagina:

PHP manual

0

Infine si innescherà anche se non fa eccezione sono stati catturati.

provare questo codice per capire perché:

<?php 
class Exep1 extends Exception {} 
class Exep2 extends Exception {} 

try { 
    echo 'try '; 
    throw new Exep1(); 
} catch (Exep2 $e) 
{ 
    echo ' catch '; 
} finally { 
    echo ' finally '; 
} 

echo 'aftermath'; 

?> 

l'uscita sarà

try finally 
Fatal error: Uncaught exception 'Exep1' in /tmp/execpad-70360fffa35e/source-70360fffa35e:7 
Stack trace: 
#0 {main} 
    thrown in /tmp/execpad-70360fffa35e/source-70360fffa35e on line 7 

qui è il violino per voi. https://eval.in/933947

Problemi correlati