Nelze odchytit Nette\Application\BadRequestException #404

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

Zdravím,
už asi 3 dny se mi nedaří odchytit Nette\Application\BadRequestException #404. Mám verzi NETTE 2.1.1 a absolutně nechápu v čem může být problém. Přikládám metodu z presenteru, která mě tuto chybu vyhazuje. Prosím řekněte proč moje řešení nefunguje nebo mě napište rovnou kód, jak to mám přepsat, aby to fungovalo. Díky!

  /** @var int $event */
  public function renderAddround($event = 0)
	{
    try {
      // template promenne
      $this->template->event = $this->database->findById('events',(int)$event);
      if(!$this->template->event || $this->template->event == null || (isset($this->template->event->id_user) && $this->template->event->id_user != $this->user->id))
      {
        $this->flashMessage('Neplatná událost.');
        $this->redirect('default');
      }
  		$this['roundForm']['save']->caption = 'Vložit';
    } catch (\Nette\Application\BadRequestException $e) {
      $this->flashMessage($e->getMessage(), 'chyba');
      $this->redirect('default');
    }
	}
jiri.pudil
Nette Blogger | 1034
+
0
-

Jaký je text té výjimky? To by ti mělo napovědět, kde je problém.

zdrhal
Člen | 42
+
0
-

To já vím text je tento:

**Nette\Application\BadRequestException #404

Invalid value for parameter ‚event‘ in method App\Presenters\DashboardPresenter::renderAddround(), expected integer.**

Docílil jsem ji tím, že do int ideventu (nazvane event) jsem pomoci url poslal string. Jenže se mi to nedari nijak odchytit. :-(

MartinitCZ
Člen | 580
+
0
-

Nahrad $event = 0 pomocí $event = NULL.

jiri.pudil
Nette Blogger | 1034
+
0
-

Jen pro doplnění: ta výjimka ti nejde odchytit, protože se vyhazuje úplně jinde.

zdrhal
Člen | 42
+
0
-

Aha a já pořád jestli nemám špatný zápis. Zkusím se tím kódem prokousat. Hele vzhledem k tomu, že tomu evidentně rozumíš lépe než já kde přesně bych ji měl odchytávat?

zdrhal
Člen | 42
+
0
-

Super vyřešeno!

Problém vyřešila rada od MartinitCZ. Díky ti! :-)

Jinak díky i jiri.pudil za radu. Hnedle jsem o něco chytřejší a hlavně spokojenější. Už tu bakalářskou práci můžu v klidu odevzdat a můžu v klidu spát, páč mám ošetřený vstupy. Díky!

Editoval zdrhal (9. 7. 2014 13:32)

David Kudera
Člen | 455
+
0
-

Kdyžtak ještě tyhle různá přesměrování by měla být ideálně v action* metodách, které se provedou dřív než render* metody. Je totiž zbytečné nechat nette pracovat např. na tvorbě šablony apod., když je uživatel potom přesměrován. dokumentace.

V action metodě může být celé načtení z db i přesměrování, uložení do privátní proměnné presenteru a v render metodě může být už načtená a ověřená proměnná jen předána šabloně.

zdrhal
Člen | 42
+
0
-

Jasně děkuji :-) Tohle mě nenapadlo, že můžu ušetřit nějaký desetinky. Ještě bych se chtěl zeptat, kde se ošetří chyba:

Nette\Application\UI\BadSignalException #403

There is no handler for signal 'nextMon' in class App\Presenters\DashboardPresenter.

To jest, pokud změním v url název handleru, který nemám v presenteru definován.

Např.
z:
moje_vtipna_url&do=nextMonth

na:
moje_vtipna_url&do=aTedToShodim

Editoval zdrhal (9. 7. 2014 14:49)

David Matějka
Moderator | 6445
+
0
-

proc to chces osetrovat? proste to spadne do error presenteru…

zdrhal
Člen | 42
+
0
-

Nechci, aby uživatel viděl červenou obrazovku error. Při této chybě ho chci nasměrovat na defaultní stránku a informovat ho o tom, že dotazovaný signál neexistuje.

Editoval zdrhal (9. 7. 2014 15:03)

David Matějka
Moderator | 6445
+
0
-

Uzivatel na produkci cervenou obrazovku neuvidi. Od toho je prave error presenter
Pokud tedy nebudes sikovny jako tady :)

Editoval matej21 (9. 7. 2014 15:09)