try/catch funguje podivne ve FormSubmitted

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

Ahoj, mám

presenters/AdminPresenter.php

public function vlozNovinkuFormSubmitted(Nette\Application\UI\Form $form)
        {
            try {

                $this->novinky->vlozNovinku(array(
                    'perex' => $form->values->perex,
                    'text' => $form->values->text,
                    'id_uzivatele' => $this->getUser()->getId()
                ));

                $this->flashMessage('Novinka přidána.');
                $this->redirect('this');

            } catch(Exception $e) {
                $form->addError('Při vkládání se vyskytla chyba: '.$e);
            }

        }

models/Novinky.php

public function vlozNovinku($arr)
	{
		$this->db->query('INSERT INTO [novinky]', $arr);
	}

pokuď do SQL INSERTU vložim uměle chybu tak se to chová správně a přes flash zprávičky se do stránky vypíše SQL syntax error.. pokuď ale vše spravim, tak se mi vypíše novinka se vložila v pořádku (což je pravda, do databáze se údaj vloží) ale taky se mi vypíše

Při vkládání se vyskytla chyba: exception 'Nette\Application\AbortException' in C:\web\www\stranka.cz\libs\Nette\Application\UI\Presenter.php:640 Stack trace: #0 C:\web\www\stranka.cz\libs\Nette\Application\UI\Presenter.php(624): Nette\Application\UI\Presenter->terminate() #1 C:\web\www\stranka.cz\libs\Nette\Application\UI\Presenter.php(686): Nette\Application\UI\Presenter->sendResponse(Object(Nette\Application\Responses\RedirectResponse)) #2 C:\web\www\stranka.cz\libs\Nette\Application\UI\PresenterComponent.php(405): Nette\Application\UI\Presenter->redirectUrl('http://stranka.cz...', NULL) #3 C:\web\www\stranka.cz\app\presenters\AdminPresenter.php(43): Nette\Application\UI\PresenterComponent->redirect('this') #4 [internal function]: AdminPresenter->vlozNovinkuFormSubmitted(Object(Nette\Application\UI\Form)) #5 C:\web\www\stranka.cz\libs\Nette\common\Callback.php(101): call_user_func_array(Array, Array) #6 C:\web\www\stranka.cz\libs\Nette\common\ObjectMixin.php(60): Nette\Callback->invokeArgs(Array) #7 C:\web\www\stranka.cz\libs\Nette\common\Object.php(81): Nette\ObjectMixin::call(Object(Nette\Application\UI\Form), 'onSuccess', Array) #8 C:\web\www\stranka.cz\libs\Nette\Forms\Form.php(429): Nette\Object->__call('onSuccess', Array) #9 C:\web\www\stranka.cz\libs\Nette\Forms\Form.php(429): Nette\Application\UI\Form->onSuccess(Object(Nette\Application\UI\Form)) #10 C:\web\www\stranka.cz\libs\Nette\Application\UI\Form.php(137): Nette\Forms\Form->fireEvents() #11 C:\web\www\stranka.cz\libs\Nette\Application\UI\Presenter.php(317): Nette\Application\UI\Form->signalReceived('submit') #12 C:\web\www\stranka.cz\libs\Nette\Application\UI\Presenter.php(193): Nette\Application\UI\Presenter->processSignal() #13 C:\web\www\stranka.cz\libs\Nette\Application\Application.php(131): Nette\Application\UI\Presenter->run(Object(Nette\Application\Request)) #14 C:\web\www\stranka.cz\app\bootstrap.php(41): Nette\Application\Application->run() #15 C:\web\www\stranka.cz\www\index.php(16): require('C:\web\www\ixne...') #16 {main}

nevíte v čem je problém ? děkuji

Aurielle
Člen | 1281
+
0
-

AbortException nesmíš zachytávat, slouží pro správné fungování aplikace. Pokud ji zachytíš, znovu ji vyhoď.

muflix
Člen | 92
+
0
-

aha, dekuji.. muzu se jeste zeptat jakym zpusobem ? :-)

mkoubik
Člen | 728
+
0
-
public function vlozNovinkuFormSubmitted(Nette\Application\UI\Form $form)
        {
            try {
                ...
            } catch(Exception $e) {
                $form->addError('Při vkládání se vyskytla chyba: '.$e);
                if ($e instanceof \Nette\Application\AbortException) {
                    throw $e;
                }
            }
        }
Jan Endel
Člen | 1016
+
0
-

Osobně ještě považuju odchytávání čisté Exception a její výpis přímo uživateli za jednu z největších prasáren. Pokud nastane problém, na který je aplikace stavěná (třeba pokus registrace uživatele se stejným uživatelským jménem), tak by se měla odchytávat PDOException a ještě kontrolovat její chybový kód, a pokud se neshoduje s předpokládáným throwovat chybu znova. Protože pak klidně může dojít k situaci:

Při vkládání se vyskytla chyba: SQLSTATE[28000] [1045] Access denied for user 'user'@'localhost' (using password: YES)

Což typického uživatele nezajíma a škodícího uživatele navede k tomu, že ví pod jakým názvem se aplikace připojuje k databázi, celé je to fuj!

muflix
Člen | 92
+
0
-

supr, moc děkuji.