Tak, czytałem o wyjątkach dzisiaj w podręczniku online PHP i zdałem sobie sprawę, że jeszcze nie rozumiem celu lub prawdziwej konieczności słowa kluczowego finally. Czytałem tutaj niektóre posty, więc moje pytanie jest nieco inne.W jaki sposób keywod "w końcu" ma być użyty w PHP?
Rozumiem, że możemy użyć w końcu w ten sposób:
function hi(){
return 'Hi';
}
try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}
echo hi();
wyjściowa:
Fatal error: Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167
Tak więc, w tym przypadku hi function(); nie jest wykonywany i nie bez powodu. Rozumiem, jeśli wyjątek nie jest obsługiwany interpreter php zatrzymuje skrypt. dobry. Tak daleko od tego, co czytam, w końcu pozwala nam na wykonanie funkcji hi(); nawet jeśli wyjątek nie jest obsługiwany (nawet jeśli nie wiem dlaczego)
Więc, ten rozumiem.
try {
throw new LogicException("Throw logic \n");
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}finally{
echo hi();
}
wyjściowa:
Hi
Fatal error: Uncaught LogicException: Throw Logic in C:\Users\...a.php:167
Stack trace:
#0 {main}
thrown in C:\Users\...a.php on line 167
na ten błąd powinien wyjątek, a także „cześć” wiadomość z funkcji, nawet nie wiem dowolny wykorzystanie do tego. Ale to, czego nie podkreślam, nawet jeśli złapiemy LogicException
z haczykiem (LogicException $e)
i nie wyrzuciliśmy żadnych wyjątków, zobaczylibyśmy funkcję, która jest wykonywana, a zobaczylibyśmy wiadomość "cześć". jak w tym przykładzie
try {
throw new LogicException("Throw logic \n");
} catch (LogicException $e) {
echo $e->getMessage();
}finally{
echo hi();
}
wyjścia
// Throw logic
// Hi
Tak, nadal widzimy funkcja hi()
wykonany chociaż nie mamy Uncaught wyjątki. Dlaczego i jaki jest tego pożytek? Myślałem, że blok w końcu miał być użyty jako ostateczność w przypadku, gdyby wyjątki nie zostały złapane, nawet jeśli tak nie było, to po co to uruchamiać?
Co wersja PHP jest używana? Prawdziwa funkcjonalność 'finally' nie została dodana przed PHP 5.5. –
@AlecGordon php 7.0.1 –
Oh, to dziwne. Zgodnie z [tą analizą] (https://adayinthelifeof.nl/2013/02/12/php5-5-trycatchfinally/) ostatni blok powinien zostać wydrukowany przed nieprzechwyconym wyjątkiem. –