2013-06-25 23 views
17

Rozważmy te dwa przykładyCo to jest słowo kluczowe "finally" w 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 
?> 

i

<?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 
?> 

Jaka jest różnica? Czy istnieje sytuacja, w której pierwszy przykład nie wykonałby some_code(), ale drugi byłby? Czy całkowicie pomijam ten punkt?

+4

'Kod wewnątrz bloku finally zawsze będzie wykonywany po spróbować połowu bloków, niezależnie od tego, czy wyjątek został rzucony, a przed normalne wykonanie resumes.' –

+0

myślę, że to jest związane w tym wątku: http://stackoverflow.com/questions/15031515/can-i-use-try-catch-finally-like-this – JunM

+0

Po prostu, aby uratować kogokolwiek innego kopiowanie-wklejanie z podręcznika PHP, przeczytałem, ale nie Rozumiem różnicę między tymi dwoma przykładami, inaczej nie zadałbym tego pytania. – marxjohnson

Odpowiedz

37

Jeśli przechwycisz wyjątek (dowolny wyjątek) dwie próbki kodu są równoważne. Ale jeśli poradzisz sobie tylko z określonym typem wyjątku w swoim bloku klasy i pojawi się inny rodzaj wyjątku, wtedy some_code(); zostanie wykonany tylko, jeśli masz blok finally.

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

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

ale:

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

Wartość +1 za cytowanie konkretnej instancji, gdy 'some_code()' nie zostanie wykonane –

+0

Bardzo jasne i pomocne ... –

+0

Spędziłem trochę czasu, badając, dlaczego są one w ogóle użyteczne, i na koniec (gra słów nie jest przeznaczona), twoja odpowiedź daje prawidłowe uzasadnienie dla konieczności ostatecznego bloku. –

-1

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

Watch od: 12:30 począwszy

obejrzeć ten film. Jednak język to JAVA. Ale myślę, że ilustruje wyjątki i użycie słowa kluczowego ostatecznie bardzo dobrze.

+0

Dzięki soden, to wyjaśnia to, co już wiem, tzn. Że działa niezależnie od czy jest wyjątek. Ale czy kod umieszczony jest za blokiem, prawda? Czy istnieje szczególna korzyść z posiadania go jako części bloku? – marxjohnson

+0

Zależy od tego, jak bardzo wyjątek ma zostać usunięty z użytkownika. Ogólnie mówiąc, używanie w końcu jest rzadkością. – sodhancha

0

fianlly blok jest używany, gdy chcesz kawałek kodu do wykonania, niezależnie od tego, czy wystąpił wyjątek czy nie ...

Wyjazd Przykład 2 na tej stronie:

PHP manual

0

Wreszcie wywoła nawet jeśli nie jest wyjątkiem zostali złapani.

Spróbuj tego kodu, aby zrozumieć, dlaczego:

<?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'; 

?> 

wyjście będzie

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 

tutaj jest skrzypce dla Ciebie. https://eval.in/933947