Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
davidivad
Člen
Avatar
davidivad:7.12.2014 13:05

Zaujímalo by ma, či je možné odchytiť všetky možné výnimky naraz. Z toho, čo som sa dočítal v seriály o OOP tu na itnetwork a z toho, čo som teraz googloval mi vyplývá, že to asi nepojde, lebo hneď ako nastane výnimka tak sa vyhodí a síce ju možem obaliť-propagovať (ako je to vysvetlené v seriály tu), ale to slúži skor na pretvorenie výnimky do nejakej inej. Lenže ostatný kód v "try" ktorý by mohol vyhodiť ďalšiu výnimku, sa už nevykoná.

Konkrétne ide o to, keď mám registráciu a validujem viac vecí - formát mailu, hesla, captcha... Tak aby to vyhodilo rovno všetky chyby a nie postupne najprv chyba v captche, potom vo formáte mailu, hesla, existujúci užívateľ atď. Predsa len by bolo lepšie, aby sa vyhodili všetky chyby vo formulári naraz

 
Odpovědět
7.12.2014 13:05
Avatar
Odpovídá na davidivad
Matúš Petrofčík:7.12.2014 13:46

Vynimky sa dedia od vynimky Exception, ktora je uplne najvseobecnejsia. A preto ak odchytime Exception, je jedno aka vynimka bola vyvolana, bude odchytena ak dedi od tejto Exception.

try {
// kod vyhodi hociaku vynimku odvodenu od Exception
} catch (Exception $e) {
// kod ktory sa vykona po odchyteni hociakej vynimky odvodenej od Exception
}

Blokov catch moze byt za sebou aj viacero, a tak mozes odchytavat viacero typov vynimiek za sebou. Odchytava sa od najkonkretnejsej po najvseobecnejsiu (Exception).

Nahoru Odpovědět
7.12.2014 13:46
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na davidivad
Martin Konečný (pavelco1998):7.12.2014 13:47

To asi půjde jedině tak, že si ty chyby budeš postupně ukládat (třeba do pole nebo řetězce) a potom vyhodíš výjimku jen jednu.
Mohl by sis třeba udělat vlastní výjimku, která by místo stringu akceptovala pole (pole chyb) s metodou, která by ty chyby vypsala jako string.

Něco ve smyslu

class FormException extends Exception
{

  private $errors = array();

  public function __construct(array $errors = array(), $code, $previous)
  {
     parent::__construct(NULL, $code, $previous);
     $this->errors = $errors;
  }


  public function getErrorsAsString()
  {
    $s = "<ul>";
    foreach ($this->errors as $error) {
      $s .= "<li>{$error}</li>";
    }
    $s .= "</ul>";

    return $s;
  }

}

// formulář
try {
  $errors = array();
  if (empty($_POST["name"])) {
    $errors[] = "Nezadal jsi jméno";
  }
  if (empty($_POST["password"])) {
    $errors[] = "Nezadal jsi heslo";
  }
  ...

  if (!empty($errors)) {
    throw new FormException($errors);
  }

  // uložení dat do DB
} catch (FormException $e) {
  echo $e->getErrorsAsString();
}
Editováno 7.12.2014 13:49
Nahoru Odpovědět
7.12.2014 13:47
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
davidivad
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
davidivad:7.12.2014 14:45

mhm. díky moc obom. už to začínam chápať. ja som chybne vychádzal z toho, že akonáhle sa v bloku try nájde jedna výnimka, tak sa skočí do bloku catch. Ale ono to vlastne prejde celé a potom ide do catch

 
Nahoru Odpovědět
7.12.2014 14:45
Avatar
Odpovídá na davidivad
Matúš Petrofčík:7.12.2014 14:56

Praveze dobre si to pochopil. Ak sa v bloku try vyhodi vynimka, prestane sa spracuvat dalsi kod v bloku try a rovno sa skoci do bloku catch. Tam sa vykona kod, ktory sa ma vykonat v pripade vynimky. Blokov catch moze byt viacero (ako som pisal vyssie).

Nahoru Odpovědět
7.12.2014 14:56
obsah kocky = r^2 ... a preto vlak drnká
Avatar
davidivad
Člen
Avatar
Odpovídá na Matúš Petrofčík
davidivad:7.12.2014 18:48

aha, aha. no nič, idem na to mrknúť znovu

 
Nahoru Odpovědět
7.12.2014 18:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.