Zobrazení ErrorPresenteru namísto zpracování výjimky v catch bloku
- miira
- Člen | 13
Ahoj,
řeším takovou, alespoň pro mě zvláštní věc. Mám presenter, ve kterém
je formulář sbírající e-mailové adresy od uživatelů pro zasílání
novinek. E-mailová adresa se ukládá do tabulky ‚subscribers‘, která má
nad sloupce ‚email‘ definován unikátní index.
Kód který se stará o zpracování formuláře s vyplněnou mailovou adresou
vypadá takto:
<?php
public function subscriptionFormSubmitted($form) {
$data = (object) $form->getValues();
$subscriber = new SubscriberModel();
$subscriber->email = $data->email;
$subscriber->active = 1;
try{
$subscriber->save();
$this->flashMessage('Váš e-mail byl uložen.');
} catch(DbException $ex) {
// pokud je e-mailová adresa v databázi již uložena
if($ex->getCode() == 1062) {
$this->flashMessage('E-mail už je v naší databázi');
} else {
$this->flashMessage('Váš e-mail se nepodařilo uložit', 'error');
}
}
$this->redirect('Index:');
}
?>
A teď k jádru problému. Pokud e-mailová adresa v databázi již existuje, vyhodí se správně výjimka typu DbException, ale namísto aby byla odchycena v catch bloku a nahrazena flash zprávičkou pro uživatele, vyskočí klasický error presenter s „500 internal server error“ a výjimka je zalogována do app/log. Podotýkám, že k tomuto chování dochází pouze v produkčním módu, pokud na serveru nastavím development mód, je výjimka normálně zpracována v catch bloku.
Používám Nette 0.9.7.
Díky
- miira
- Člen | 13
BigCharlie napsal(a):
chyba při zpracování v error presenteru? U mě to tak bylo…
Nevím, jestli jsem tě přesně pochopil, ale error presenter se zobrazí korektně a zalogovaná výjimka je opravdu DbException, nikoliv „Error while executing error presenter“ či jak to Nette píše v případě, že se error presenter nechová jak má.
Chová se to jako kdyby při vyhození výjimky rovnou zakročila Laděnka, bez toho, aby kód vůbec došel do catch bloku (což je samozřejmě dost divný popis, nicméně se to tak jeví :))
- BigCharlie
- Člen | 283
Aha, tak to jsem špatně přečetl a pochopil já. Pak už mě jedině napadá, že vyhazuješ tu výjimku ještě někde jinde (třeba po redirectu?) – s tím, že by se ignoroval catch blok, jsem se ještě nesetkal.
- fistaro
- Člen | 3
Ahoj, mám uplně stejný problem, ale v bledě modrém. AuthenticationException rovněž nedojde do catch bloku a na vyvoji vraci ladenku s textem z throw a na produkcnim server 500 error. :(
edit: Tak jsem trochu pokoumal, pokud vymenim AutheticationException pouze za Exception tak vse funguje. Nevim kde je chyba, protoze v AuthenticationException.php je jenom class → extends a jinak je cista.
Editoval fistaro (17. 5. 2011 12:06)