Diskuze: Odchytávanie všetkých výnimiek naraz

PHP PHP Odchytávanie všetkých výnimiek naraz American English version English version

Avatar
davidivad
Člen
Avatar
davidivad:

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
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na davidivad
Matúš Petrofčík:

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):

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  +1 7.12.2014 13:47
Avatar
davidivad
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
davidivad:

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
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na davidivad
Matúš Petrofčík:

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  +1 7.12.2014 14:56
obsah kocky = r^2 ... a preto vlak drnká
Avatar
davidivad
Člen
Avatar
Odpovídá na Matúš Petrofčík
davidivad:

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.