Easy guys... Proszę Was, taka dyskusja do niczego nie prowadzi.
Jak zwykle każdy ma trochę racji i wszystko da się rozwiązać, ale po kolei.
Cytat
Funkcja __autoload() służy do automatycznego ładowania pliku.
Koledze chodzi właśnie o własne błęd z wyjątkami.
Tak ale jej wykorzystanie do niczego nie prowadzi w tym konkretnym przypadku. Funkcja ta jest wywoływana w przypadku kiedy nie została znaleziona definicja klasy, a nie dołączany plik.
Cytat
Wszystko ok, tyle że klasa ErrorException już istnieje
No jakby nie było. A ta skąd się wzięła? Ktoś wie gdzie jest jej definicja? Swoją drogą kolejny przykład, który utwierdza mnie w przekonaniu, że brak przestrzeni nazw w php jest dużym minusem i powinny się pojawić w 6.
Cytat
W obecnej postaci ten sposób jest nie do zaakceptowania, ponieważ zatrzymuje egzekucję kodu po błędzie pomimo tego, że wyjątek został obsłużony przez handleException (zatrzymuje go handleError).
Jest to prawdę mówiąc dobra uwaga. Mój przykład wygląda tak, ponieważ osobiście mam bardzo restrykcyjne podejście do błędów. Staram się z takim samym naciskiem eliminować błędy typu fatal jak i notice. Myślę że takie podejście się sprawdza, ale rzeczywiście php w stosunku do pewnych błędów zachowuje się inaczej i pozwala aby wykonywanie kodu było kontynuowane.
Decydując się na wyjątki w pewnym sensie zrezygnowaliśmy z takiej możliwości. Czy to źle? czy dobrze? ..tutaj każdy będzie miał swoje zdanie.
Spróbujmy zrobić mały refactoring, aby rozwiązać problem jaki ma
Ozzy.
Po pierwsze wyrzucając wyjątek w bloku try, nie mamy możliwości kontynuowania kodu w tymże bloku. Aplikacja będzie działać dalej, przechodząc do odpowiedniego bloku catch. Więc będziemy musieli zrezygnować z bloku try (tam gdzie nie jest konieczne jego używanie) i polegać na funkcji
set_exception_handler.
Potrzebna zmiana dotyczy metody ErrorHandler::handleError()
<?php
public function handleError( $iErrNo, $sErrStr, $sErrFile, $sErrLine )
{
set_exception_handler
( array( $this, 'handleException' ) );
{
if ($iErrNo & (E_NOTICE | E_USER_NOTICE)) {
$this->handleException( new NoticeErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine ) );
} else if ($iErrNo & (E_WARNING | E_USER_WARNING | E_CORE_WARNING | E_COMPILE_WARNING)) {
$this->handleException( new WarningErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine ) );
} else if ($iErrNo & (E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR)) {
throw new FatalErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine );
} else {
throw new UnknownErrorException( $sErrStr, $iErrNo, $sErrFile, $sErrLine );
}
}
}
?>
Teraz np. kod
<?php
include 'wrong_file.inc.php';
echo 'Kolejne instrukcje';
?>
wykona się w całości. Natomiast ten
<?php
echo 'Kolejne instrukcje';
?>
z wiadomych przyczyn nie.
Jeśli spodziewalibyśmy się jakiegoś konkretnego wyjątku, który wymaga obsłużenia należałoby oczywiście bezwzględnie zamknąć taki kod w bloku try.