2010-07-29 7 views
14

Czy jest coś podobnego w PHP do try ... else w Pythonie?php try ... else

Muszę wiedzieć, czy blok try został wykonany poprawnie, jak przy poprawnie wykonanym bloku, zostanie wydrukowany komunikat.

Odpowiedz

-1

Można użyć try { } catch() { } i throw. Zobacz http://php.net/manual/en/language.exceptions.php

try { 
    $a = 13/0; // should throw exception 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

lub ręcznie:

try { 
    throw new Exception("I don't want to be tried!"); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 
+0

Chcesz wyjaśnić sprawę? Czy popełniłem błąd? – MvanGeest

+2

Nie padłem, ale pytał o blok "else", a nie o wyjątki w ogóle ... – ircmaxell

+0

Oh, a '$ a = 13/0;' nie wyrzuci wyjątku, chyba że masz zainstalowany moduł obsługi błędów, który zgłasza wyjątki ('set_error_handler (function ($ errno, $ errstr, $ errfile, $ errline) {throw new ErrorException ($ errstr, 0, $ errno, $ errfile, $ errline);}); '... http://www.php.net/manual/en/class.errorexception.php) – ircmaxell

-1

There to jest try-catch w php.

Przykład:

function inverse($x) { 
    if (!$x) { 
     throw new Exception('Division by zero.'); 
    } 
    else return 1/$x; 
} 

try { 
    echo inverse(5) . "\n"; 
    echo inverse(0) . "\n"; 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

// Continue execution 
echo 'Hello World'; 
+0

Pytanie dotyczyło odpowiednika php dla "try-else" Pythona, który ma zwarty sposób wykonywania bloku kodu po bloku try, gdy nie jest zgłaszany wyjątek. – vokimon

40

PHP nie posiada try/catch/indziej. Można jednak ustawić zmienną w bloku catch, które mogą być używane do określenia, czy był prowadzony:

$caught = false; 

try { 
    // something 
} catch (Exception $e) { 
    $caught = true; 
} 

if (!$caught) { 

} 
+0

To jest pełne instrukcji '$ caught = true;' jeśli istnieje kilka bloków 'catch'. – Artefacto

+0

Ale tak działa również python "else". – webbiedave

+2

Jedna drobna uwaga, blok innego pythona byłby wykonany, gdyby '$ caught' był fałszywy, nieprawda ... – ircmaxell

0
try { 
    $clean = false; 
    ... 
    $clean = true; 
} catch (...) { ... } 

if (!$clean) { 
    //... 
} 

To najlepsze, co możesz zrobić.

+0

Powinieneś ustawić $ clean na jego wartość początkową, zanim przejdziesz do bloku try..catch. Zobacz odpowiedź webbiedave. – jmz

+0

@jmz Hum? Czemu? jest obojętny; nie ma żadnego zakresu blokowego w PHP. – Artefacto

4

Myślę, że klauzula "else" jest nieco ograniczona, chyba że nie przejmujesz się wyjątkami tam zgłaszanymi (lub chcesz wywrzeć te wyjątki) ... Z mojego rozumienia Pythona wynika, że ​​jest to odpowiednik to:

try { 
    //...Do Some Stuff Here 
    try { 
     // Else block code here 
    } catch (Exception $e) { 
     $e->elseBlock = true; 
     throw $e; 
    } 
} catch (Exception $e) { 
    if (isset($e->elseBlock) && $e->elseBlock) { 
     throw $e; 
    } 
    // catch block code here 
} 

Więc to jest nieco bardziej rozwlekły (ponieważ trzeba ponownie rzucać wyjątki), ale także propaguje się stos tak samo jak klauzula innego ...

Edit Lub, nieco czystsza wersja (tylko 5.3)

class ElseException extends Exception(); 

try { 
    //...Do Some Stuff Here 
    try { 
     // Else block code here 
    } catch (Exception $e) { 
     throw new ElseException('Else Clasuse Exception', 0, $e); 
    } 
} catch (ElseException $e) { 
    throw $e->getPrevious(); 
} catch (Exception $e) { 
    // catch block code here 
} 

Edycja 2

Ponowne czytanie pytanie, myślę, że może być overcomplicating rzeczy z „innego” bloku ... Jeśli jesteś po prostu drukowania (co jest mało prawdopodobne, aby rzucić wyjątek), naprawdę nie trzeba blok innego:

try { 
    // Do Some stuff 
    print "Success"; 
} catch (Exception $e) { 
    //Handle error here 
    print "Error"; 
} 

ten kod będzie tylko kiedykolwiek wydrukować alboSuccess lub Error ... Nigdy oba (ponieważ jeżeli funkcja print zgłasza wyjątek, to won” t faktycznie drukowane ... Ale nie sądzę, że print CAN może zgłaszać wyjątki ...).

+0

W moim przypadku działało dobrze, umieszczając następne 'try {}' wewnątrz 'catch {}' – Pathros

+0

@ircmaxell Twoja odpowiedź "Edytuj 2" jest dobrą odpowiedzią. Może opublikuj to jako osobną odpowiedź, aby można było samodzielnie głosować. – Beetle