Exception nedoputuje do catch

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

Zdravím,
mám na php 5.3 tento obecný kód starající se o databázi:

/**
 * zapise data do DB
 *
 * @param array data data pro ulozeni
 * @return int id vlozeneho zaznamu
 */
public function save($data)
{
    try {
        // insert
        if ( !isset($data[$this->pk]) ) {
            $this->table->insert($data);
            return $this->db->lastInsertId();
        }
        else {//update
            $this->table->find($data[$this->pk])->update($data);
            return $data[$this->pk];
        }
    }
    catch(\PDOException $e) {
        dump('databazova chyba:' . $e->getMessage());
    }
}

a pri vkladani noveho zaznamu pokud dám stejnou hodnotu do sloupce UNIQUE tak mi exception vybubla az do nette ladenky a vyhodi `SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‚testcz‘ for key ‚url‘ ` misto zmineneho dumpu, delam neco spatne? Uz jsem z toho tuplachovej. (debug vysviti radek s insert($data);)

Editoval pilec (21. 8. 2011 16:18)

22
Člen | 1478
+
0
-

v tom dump máš další syntax error imho, chybí ti tam uvozovka.

Jan Endel
Člen | 1016
+
0
-

opraveno, ale stejne to tam nedoputuje.

22
Člen | 1478
+
0
-

to by jsi měl použít snad dovjité uvozovky nebo:

dump('databazova chyba: ' . $e->getMessage());
Jan Endel
Člen | 1016
+
0
-

Preprisuju to jen na forum, v aplikaci mam ten catch trosku jinac, ale jde o to, ze se to zasekne uz v tom try a do catch uz se ani nepodiva.

22
Člen | 1478
+
0
-

a všeobecnou Exception to chytne? Bych dal na konec ještě exit;

Editoval 22 (21. 8. 2011 16:31)

Jan Endel
Člen | 1016
+
0
-

Obecnou Exception to taky neodchytí, i exit jsem zkoušel dát.

(btw, používám Nette\Database)

Editoval pilec (21. 8. 2011 16:34)

22
Člen | 1478
+
0
-

Nejsem si jistej, jestli do try/catch bloku můžeš dát takto if/else, zkusil bych try/catch bloky dát až dovnitř těch if/else

Jan Endel
Člen | 1016
+
0
-

hmm, tak vazne tomu try blby if a else, ackoliv nechapu proc.

22
Člen | 1478
+
0
-

že by ten return? Nebo zkus vyhodit větev else a nahradit if(isset(..))

edit: nebo ten return hodit až za try/catch blok

Editoval 22 (21. 8. 2011 16:49)

Jan Endel
Člen | 1016
+
0
-

Zakomentovani return bylo to prvni co me napadlo, bohuzel ani nahrazeni else za if(isset(..)) me nedovedlo ke kyzenemu vysledku.

22
Člen | 1478
+
0
-

jn, osobně jsem se do takové konstrukce ještě nedostal a řekl bych, že se takto vyjímky nepoužívají. Try/catch blok by měl obalovat jen metodu/kod, která může vyvolat vyjímku. Takže předpokládám, že if/else žádnou vyjímku nevyvolá a tedy vyjímka se ti vratí do presenteru přes ten return

Editoval 22 (21. 8. 2011 18:03)

David Grudl
Nette Core | 8228
+
0
-

S největší pravděpodobností to bude bug v PDO, takové chování jsem tam taky zaznamenal, reportoval, mělo by být opravené v 5.3.7.