Prosba o radu s rozvržením tříd a probubláváním errorů mezi třídami
- Budry
- Člen | 88
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
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…
- Budry
- Člen | 88
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
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
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)