2011-01-27 8 views
23

W PHP, czasami złapać kilka wyjątków z try/catch:złapać wyjątek, nie robiąc nic w połów

try { 
    ... 
} catch (Exception $e) { 
    // Nothing, this is normal 
} 

z tego rodzaju kodu, ja skończyć ze zmienną $ e, który jest stworzony na nic (dużo zasobów), a PHP_MD (PHP Mess Detector) tworzy ostrzeżenie z powodu nieużywanej zmiennej.

Czy istnieje sposób na wychwycenie wyjątku bez konieczności tworzenia zmiennej?

Dzięki

+1

Wyjątek nie powinien być traktowany jako "normalny" - jest to wyjątek lub nie. Co rzuca wyjątków? –

+0

Testuję, że model rzuca wyjątek, kiedy powinien. Mam pusty blok catch, ponieważ chcę przetestować wyjątek. –

Odpowiedz

6

To cały punkt wyjątki - można mieć wiele różnych bloków catch złapać żadnych wyjątków, którą chce się obsłużyć. Dane wyjątku muszą być gdzieś przypisane, stąd zmienna. Możesz zrobić coś takiego, jak unset($e) wewnątrz bloku catch, jeśli naprawdę nie chcesz widzieć tych ostrzeżeń ... lub wyłączyć ostrzeżenia (generalnie zły pomysł).

6

nr

W każdym razie, to zazwyczaj jest to zły pomysł, aby złapać wyjątek i nic nie robić; wyjątki istnieją właśnie po to, aby zmusić cię do poradzenia sobie z wyjątkową sytuacją (w przeciwnym razie wykonanie zostanie przerwane), więc zrozumiałe jest, że język nie ułatwia takiego użycia.

+3

Jednocześnie generalnie nie jest dobrym pomysłem wyrzucenie wyjątku, gdy prawdopodobnie potrzebujesz kodu statusu. Gdyby wyjątki były naprawdę wyjątkowe, nie zobaczylibyśmy tylu bezużytecznych bloków try/catch. W szczególności wiele narzędzi sieciowych rzuca wyjątki, gdy pojawia się problem z siecią, który przerywa enkapsulację i tak naprawdę nie pomaga programistom. Problem sieciowy nie powinien być wyjątkowy, gdy jesteś narzędziem sieciowym, powinieneś być w stanie obsłużyć go wewnętrznie. –

+0

To głównie do testów: sprawdź, czy wyjątek został zgłoszony ... –

-1

Wyjątki są stosowane nie tylko w wyjątkowych okolicznościach.

Ten scenariusz w rzeczywistości wykorzystuje wyjątki, aby upewnić się, że użytkownik jest wylogowany. W tym momencie w skrypcie jest bardzo drogie, aby dowiedzieć się, jakie dane powinny być przycinane, więc jest tak naprawdę szybciej, aby po prostu przyciąć wszystko i wychwycić wyjątki.

 try { 
     GDS::$DB->exec('DELETE FROM sessions WHERE session_id = ' . session_id()); 
     GDS::$DB->exec('DELETE FROM sessions WHERE user_id = ' . $this->data['user_id']); 
    } catch(PDOException $ex) {} 
    session_regenerate_id(true); 
    setcookie('bis_[user_id]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_start]', 0, time() - 1, null, null, false, true); 
    setcookie('bis_[session_time]', 0, time() - 1, null, null, false, true); 
+6

Jak to jest odpowiedź? –

+0

plus, to pominie drugie zdanie, jeśli pierwsze rzuty, co prawdopodobnie nie jest zamierzone. – Artefacto

3

Nie, ale można ją usunąć.

try { 
    ... 
} catch (Exception $e) { 
    unset($e); 
} 

Przyjmuję, że wychwytujesz wyjątek tylko dlatego, że nie musisz, ponieważ chcesz. Musisz użyć catch, jeśli chcesz użyć try. więc opinie ludzi na temat tego, czy złym pomysłem jest złapanie wyjątku, są nieistotne. Należy dążyć do osiągnięcia pożądanego rezultatu bez używania try/catch. O ile mi wiadomo, nie ma alternatywy.

Używam czegoś takiego do mojego silnika szablonowego.

//array of templates ordered by version new to old. 
for($templates as $tpl){ 
    try { 
     $output = render($tpl,$data); 
     //it worked 
     break; 
    } catch(ErrorException $e){ 
     unset($e); 
    } 
} 
if(!empty($output)){ 
    return $output; 
} 
Powiązane problemy