Prosba o radu s rozvržením tříd a probubláváním errorů mezi třídami

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

Zdravím,
nejsem si jist, jestli je předmět pochopitelný (jestli ne tak se omlouvám) ale snad ano.

Snažil jsem se rozdělit logicky rozdělit script, ale nejsem si jistý jestli jsem správně nastavil zpracování chyb pomocí výjimek.

Mám SectionPresenter:

public function addNewSection($form)
	{
		$values = $form->getValues();
		try
		{
			$this->**section->addNewSection**($values);
			$this->flashMessage('Success! New section created', 'success');
			$this->redirect('Homepage:');
		}
		catch(\Exception $e)
		{
			$this->flashMessage($e->getMessage(), 'error');
			$this->redirect('add');
		}

	}

Volá metodu addNewSection(…) v Section modelu

public function addNewSection($values)
	{
		try
		{
			$this->db->insert('sections', array('name' => $values->name))->execute();
		}
		catch(\Exception $e)
		{
			throw new \Exception($this->errorMessages->getError($e->getCode()));
			//$this->errorMessages->getError($e->getCode()); překládá chybu podle kódu na vlastní chybovou hlášku
		}

		$this->parser->toParse($values->....);

	}

A tady se volá model Parse a metoda toParse()

public function toParse($string)
	{
		$this->toLine($string, $this->rules['start'], $this->rules['end']);
	}

	private function toLine($string, $startLine, $endLine)
	{

		$lines = array();
		if(!preg_match_all('~\\'.$startLine.'([^"]+?)\\'.$endLine.'~', $string, $output, PREG_PATTERN_ORDER))
			throw new \Exception('Incorrect format ...');


	}

Pořád se nemůžu zbavit dojmu, že použití a zpracování výjimek a použití try{}catch(){} není úplně ideální, ale rád bych slyšel názor od někoho jiného, zkušenějšího.

Předem díky

Editoval Budry (1. 5. 2012 13:40)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

První poznámka: určitě je vhodné zavést si vlastní vyjímky – \Exception je příliš obecná, tím vždycky zachytíš úplně každou vyjímku, třeba i takovou, která značí nějaký mnohem závažnější problém (třeba při použití Nette\Object přístup k nedefinované property apod.). Takže si zaveď třeba SectionException (musí dědit od \Exception, případně od nějaké specifičtější SPL vyjímky), a tu v presenteru zachytávej.

Pro model Parse (nebylo by lepší Parser?) bych se nebál zavést si ParseException, a tu zase zachytávat o úroveň výš atd…

Elijen
Člen | 171
+
0
-

Pokud si sam odchytavas vyjimky, je dobre si je logovat. Takhle se o nich dozvi pouze uzivatel.

Budry
Člen | 88
+
0
-

vojtech.dobes:

Pro model Parse (nebylo by lepší Parser?)

… on se tak jmenuje upsal jsem se…

Vlastní výjimky jsou dobrý nápad :) už jsem zase o kus chytřejší :-D

Ale šlo mi spíše o to jestli použít try{} v presenteru kde budu uvnitř volat model ve kterém je try{} zase

// SectionPresenter
try
{
	$this->**section->addNewSection**($values);
...

// Model Section->addNewSection()
try
{
        $this->db->insert('sections', array('name' => $values->name))->execute();
}
...

Editoval Budry (1. 5. 2012 16:30)

Jan Suchánek
Člen | 404
+
0
-

Existuje nějaký pěkný a správný příklad používání vyjímek v Nette Presenteru, Modelu a třeba komponentě atp.?

Jan Suchánek
Člen | 404
+
0
-

Díky, jak ten příklad s Dibi aplikovat i pro Nette\Database?

// TaskListPresenter

public function handleDelete($taskListId)
{
	$flashMessage = "Seznam byl smazán!";
	try{
		$this->taskLists->where(array("id" => $taskListId))->delete();
	} catch (\PDOException $e) {
		$flashMessage = "Položku nelze smazat!";
	}

	$this->flashMessage($flashMessage);

	if (!$this->isAjax()) {
		$this->redirect('Task:default');
	}

	$this->invalidateControl();
}

Stačí zachytávat PDOException? A co když bude TaskLists model?

Editoval jenicek (15. 5. 2012 14:34)

Jan Suchánek
Člen | 404
+
0
-

Narazil jsem na foru na diskuzi na stejné téma, platí to ještě?