$form->onSuccess[] – Redirect hází prázdnou výjimku

fikusir
Člen | 27
+
0
-

Ahoj,

Mám toto zpracování formuláře:

	public function formEditSucceeded(Form $form, \stdClass $values): void
	{
		$feedback=$this->feedbackManager->get((Int)$values->feedback_id);
		$instruction=$this->instructionManager->get($feedback->instruction_id);
		$request=$this->requestManager->get($instruction->request_id);
		$matdata=$this->zpracovaniManager->getSingle($request->product);

		$amount=$request->paleta*(Int)$values->pal + $matdata->ksKarton * (Int)$values->car;

		try {
			$this->feedbackManager->set((Int)$values->feedback_id, $amount, (Int)$values->scraps, (Int)$values->scrapscar);
			$this->redirect('Feedbacktable:default');
		} catch (Exception $e) {
			$form->addError('Ve formuláři se vyskytla chyba: ' . $e->getMessage());
		}
	}

Když mám Redirect() v TryCatch, tak mi to stále hází prázdnou výjimku. Pokud ho z TryCatch vyjmu a nám na fonec metody, tak je to OK, nicméně to se mi zas nevypíše případná chyba.

Poradí někdo, prosím, jak je to správně? Moc díky

Marek Bartoš
Nette Blogger | 1274
+
+3
-

V prvé řadě bys neměl odchytávat obecnou Exception. Co uživateli řekne, že máš chybu v kódu nebo že se nepodařilo připojit k databázi? Pokud potřebuješ uživateli předat zprávu skrze výjimku, tak si pro ni vytvoř třídu a odchytávej tu.

Redirect ti nefunguje právě proto, že vyhazuje výjimku, kterou hnedka chytíš. Zda přesměrovat máš zjištíš pomocí $form->hasErrors()

Editoval Marek Bartoš (3. 3. 2022 14:03)

Kcko
Člen | 468
+
0
-

Nebo si tam můžeš dát

<?php
catch (Exception $e) {
if ($e instanceof Nette\Application\AbortException) {
		throw $e;
	}
}
?>

Editoval Kcko (3. 3. 2022 14:23)

fikusir
Člen | 27
+
0
-

Ahoj,

Moc díky pánové, všechny tři nápovědy dávají smysl a jsem zase o něco chytřejší. Rozhodně si vezmu k srdci to co jste napsat.

Marku, neměl jsem dobré znalosti ohledně obecné Exception a ty rozšířil Kcko. Jinak jsem uživatelům chtěl prostě cpát celou getMessage(). Jedná se o interní portál pro pár uživatelů a tak by mi bohatě stačilo, kdyby reportovali celou tu chybu.

Užijte sluníčka!

Kamil Valenta
Člen | 820
+
+4
-

Není dobrý zvyk uživatelům předkládat „generické“ exceptiony. Uživatele to nezajímá a nic jim to neřekne. V neposlední řadě ne vždy domyslíš, co všechno uživateli vyzradíš (adresářovou strukturu, citlivá data).
Tedy buď vykopnout vlastní Exceptionu se speciální textací pro uživatele (jak již bylo uvedeno), nebo beze všeho poslat obecný alert, že to selhalo, protože důvod najdeš v logu. Není důvod spoléhat na to, že to uživatel bude někam reportovat.

fikusir
Člen | 27
+
0
-

Kamile, díky za tip, máš samozřejmě pravdu. Jdu předělávat!