Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Kontynuacja pętli po błędzie
Forum PHP.pl > Forum > Przedszkole
mlody69
Witam,
mam pewien kod który coś wykonuje, powiedzmy dodaje coś do bazy x razy. Jak zrobić aby przykładowo po 29 powtórzeniu w którym jest bład szło do 30 a nie zatrzymywało skrypt i wywalało błąd?

Z góry dzięki
lord2105
Najprostsze rozwiązanie to pozbyć się błędów. Może bardziej sprecyzujesz swoje pytania. Jaki to błąd jaka pętla itp
mlody69
Nie jest możliwe pozbycie się błędów bo błędy są zalezne od danych wprowadzonych przez usera(login, hasło-zaloguje->idzie do nastepnego, jeżeli haslo zle to blad i stoi).
Pętla foreach
lord2105
Albo mi się wydaje albo kolega bawi się Brute force
bastard13
może coś takiego?:
  1. while($liczba_userow<30)
  2. { try {
  3. if(logowanie_usera()===blad)
  4. throw new Exception('wywalilo blad');
  5. }
  6. catch(Exception $e)
  7. { funkcja_obslugujaca_blad(); }
  8. }
mlody69
Żadne brute force, czysto domowe. Przykład z userem i hasłem dalem bo jest to coś podobnego.

bastard13: tak, coś w ten deseń.
bastard13
W takim wypadku w czym jeszcze problem? Napisz funkcję, która sprawdza, czy wyskoczył błąd, niech zwraca false w przypadku błędu. Następnie wywołuj instrukcje zależne od tego czy wystąpił lub nie.
mlody69
I w tym problem, że nie mam pojecia jak to zrobić ..(dział Przedszkole winksmiley.jpg)
Wicepsik
Pokaż nam kod, który napisałeś.
mlody69
  1. try {
  2. $newEntry = $cos->zrob_cos
  3. } catch (Zend_Gdata_App_HttpException $httpException) {
  4. echo $httpException->getRawResponseBody();
  5. } catch (Zend_Gdata_App_Exception $e) {
  6. echo $e->getMessage();
  7. }


  1. else {
  2. require_once 'Zend/Gdata/App/AuthException.php';
  3. throw new Zend_Gdata_App_AuthException('Reason: ' .
  4. (isset($goog_resp['Error']) ? $goog_resp['Error'] : 'Unspecified.'));
  5. }
bastard13
Zakładam, że masz kod, który wywala ci błąd:)
Wrzucasz ten kod do logowanie_usera() i:
  1. if(funkcja_ktora_czasami_wywala_bledy()===to_co_wyrzuca_gdy_jest_blad)
  2. return false;

A do funkcja_obslugujaca_blad() dajesz kod, który ma się wykonać, gdy jest błąd, ewentualnie zostaw puste klamry, jeżeli nie chcesz w żaden sposób go obsługiwać.

@up:
rozumiem, że to else wyrzuca ci wyjątek, tyle, że wyrzucasz Zend_Gdata_App_AuthException, którego akurat nie obsługujesz.
mlody69
Wywala:
  1. Fatal error: Uncaught exception 'Zend_Gdata_App_AuthException' with message
bastard13
Właśnie o tym ci napisałem posta wyżej:) obsługujesz nie te wyjątki, które wyrzucasz, dodaj:
  1. catch (Zend_Gdata_App_AuthException $e) {
  2. echo $e->getMessage();
  3. }
mlody69
Gdzie to mam dodać?Przeciez to mam tutaj:
  1. try {
  2. $newEntry = $yt->insertEntry($myVideoEntry, $uploadUrl, 'Zend_Gdata_YouTube_VideoEntry');
  3. } catch (Zend_Gdata_App_HttpException $httpException) {
  4. echo $httpException->getRawResponseBody();
  5. } catch (Zend_Gdata_App_Exception $e) {
  6. echo $e->getMessage();
  7. }
bastard13
Nie masz, ty przechwytujesz: Zend_Gdata_App_HttpException i Zend_Gdata_App_Exception, a wyrzucasz Zend_Gdata_App_AuthException, którego nie obsługujesz. Dodaj jeszcze jednego catch'a i po problemie.
mlody69
No tak,
błąd:
  1. Fatal error: Uncaught exception 'Zend_Gdata_App_AuthException' with message 'Authentication with [...]
  2. in /var/www/Zend/Gdata/ClientLogin.php:175 Stack trace: #0 /var/www/test.php(36): Zend_Gdata_ClientLogin::getHttpClient(...)
  3. #1 {main} thrown in /var/www/Zend/Gdata/ClientLogin.php on line 175


  1. catch (Zend_Gdata_App_HttpException $httpException) {
  2. echo $httpException->getRawResponseBody();
  3. } catch (Zend_Gdata_App_Exception $e) {
  4. echo $e->getMessage();
  5. } catch (Zend_Gdata_App_AuthException $e) {
  6. echo $e->getMessage();
  7. }


Jakieś propozycje?:/
bastard13
Zostaw sobie w insertEntry() jedynie (reszte zakomentuj):
  1. // require chyba nie jest potrzebna, bo z tego co kojarzę to w Zendzie jest odpowiedni autoloader
  2. throw new Zend_Gdata_App_AuthException('wyrzucony error'));

i zostaw przy przechwytywaniu tylko:
  1. try {
  2. $newEntry = $yt->insertEntry($myVideoEntry, $uploadUrl, 'Zend_Gdata_YouTube_VideoEntry');
  3. }
  4. catch (Zend_Gdata_App_AuthException $e) {
  5. echo $e->getMessage();
  6. }

i napisz czy działa.
mlody69
Pozmieniałem tak jak napisałeś i teraz gdy dane 1 są złe a drugie z kolei dobre to wywala:
Kod
Fatal error: Class 'Zend_Gdata_App_AuthException' not found in /var/www/Zend/Gdata/ClientLogin.php on line 179
bastard13
A wywaliłeś linijkę?
  1. require_once 'Zend/Gdata/App/AuthException.php';

mlody69
Ta
bastard13
to ją dodaj z powrotem:) myślałem, że w zendzie klasy są ładowane automatycznie:)
mlody69
Heh, dodałem. Wywala to:
Kod
Fatal error: Uncaught exception 'Zend_Gdata_App_AuthException' with message 'wyrzucony error :))' in /var/www/Zend/Gdata/ClientLogin.php:180 Stack trace: #0 /var/www/pp.php(44): Zend_Gdata_ClientLogin::getHttpClient('') #1 {main} thrown in /var/www/Zend/Gdata/ClientLogin.php on line 180

bastard13
Sprawdź czy działa coś takiego:
  1. try {
  2. require 'Zend/Gdata/App/AuthException.php';
  3. throw new Zend_Gdata_App_AuthException('wyrzucony error'));
  4. }
  5. catch (Zend_Gdata_App_AuthException $e) {
  6. echo $e->getMessage();
  7. }
mlody69
Nic. Przeszło już tyle możliwości, może jest jakiś sposób aby ta pętla leciała dalej :/
bastard13
Poddaję sięsmile.gif Jak chcesz, żeby leciało dalej to usuń tego elsa, w którym wyrzucasz wyjątek.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.