Zobrazení ErrorPresenteru namísto zpracování výjimky v catch bloku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
miira
Člen | 13
+
0
-

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

newPOPE
Člen | 648
+
0
-

Nemas nahodou PHP5.3 ???

tam sa mi dost casto toto stava :-D

<?php

	catch( \DBException ) {...}
	//nie je (aspon pokial pouzivam namespacy)
	catch( DBException ) {...}
?>

Editoval newPOPE (10. 4. 2011 23:25)

miira
Člen | 13
+
0
-

Díky za nápad.

Na serveru sice PHP 5.3 mám, ale aplikace je už více než rok stará, vytvořená ještě v 5.2, takže nepoužívá namespaces.

BigCharlie
Člen | 283
+
0
-

chyba při zpracování v error presenteru? U mě to tak bylo…

miira
Člen | 13
+
0
-

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
+
0
-

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 | 2
+
0
-

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)

bojovyletoun
Člen | 667
+
0
-

catch \Nette\Security\AuthenticationException ?