Catch Nette\InvalidStateException neodchytává vyjímku
- Pechy.cz
- Bronze Partner | 21
Zdravím,
potřebuju poradit. Nejsem schopen odchytit obyčejnou, nebo očividně
neobyčejnou Nette\InvalidStateException.
Nejdřív jsem se snažil odchytit chybu přímo toho typu, ale jelikož se nedařilo, několikrát jsem kód přepisoval, takže působí trochu zmatečně. Již jsem přímo na \Exception, ale ani tu to neodchytne. Já už tam prostě nic nevidím, tak bych potřeboval trochu nasměrovat.
Tracy:
http://data.pecha.pro/…c259392.html
Kód:
public function & __get($name)
{
try {
$data = parent::__get($name);
return $data;
} catch (\Exception $ise) {
// Database refetch failed; row does not exist!
// I try get now row from db
try {
...
...
...
if(!$row) {
throw new \Exception;
}
return $row->{$name};
} catch (\Exception $e) {
// If cant get row, throw original exception
throw $ise;
}
}
}
- David Matějka
- Moderator | 6445
A nedostane se to az k tomu re-throw?
} catch (\Exception $e) {
// If cant get row, throw original exception
throw $ise;
}
- Pechy.cz
- Bronze Partner | 21
David Matějka napsal(a):
A nedostane se to az k tomu re-throw?
} catch (\Exception $e) { // If cant get row, throw original exception throw $ise; }
No to mě samozřejmě napadlo taky, ale to by byl přeci v Tracy označen řádek
throw $ise;
nebo si to pletu s něčím jiným?
- David Matějka
- Moderator | 6445
nn, jako puvod vyjimky se bere misto, kde byla vytvorena instance. ne kde to bylo vyhozeno
- Pechy.cz
- Bronze Partner | 21
David Matějka napsal(a):
nn, jako puvod vyjimky se bere misto, kde byla vytvorena instance. ne kde to bylo vyhozeno
Díky za informaci, to jsem netušil.
Vyzkouším vytvořit novou ať vidím, kde to tedy padá.
Každopádně by mi pomohlo i kdyby měl někdo zkušenosti s tím, proč
vůbec tato chyba nastává.
Tohle byl jen takový pokus o „prasácký obejití“ chyby, kterou jsem
nedokázal nikdy pochopit, ani vyřešit.
Jsem si 100% jist, že řádek v db existuje, protože tato chyba padne jak se
jí zachce, v podstatě jednou za čas a ještě třeba v půlce kódu, kdy to
již s řádkem operovalo. Stačí párkrát refresh a zase vše funguje.
- Unlink
- Člen | 298
Pechy.cz napsal(a):
Každopádně by mi pomohlo i kdyby měl někdo zkušenosti s tím, proč vůbec tato chyba nastává.
Tohle byl jen takový pokus o „prasácký obejití“ chyby, kterou jsem nedokázal nikdy pochopit, ani vyřešit.
Jsem si 100% jist, že řádek v db existuje, protože tato chyba padne jak se jí zachce, v podstatě jednou za čas a ještě třeba v půlce kódu, kdy to již s řádkem operovalo. Stačí párkrát refresh a zase vše funguje.
Prečo tá výnimka vzniká som vysvetľoval tuna
https://forum.nette.org/…es-not-exist#…
bol som presvedčený že ten riadok zmizne, ale očividne bude problém ešte niekde inde, ak ten tvoj „hack“ s tým, že si ten riadok načítaš dodatočne funguje (a máš to overené) tak by sa zišla ukážka ako s tým pracuješ, aj keď presne neviem ako funguje YetORM ale možno by sa nám podarilo spraviť nejaký kus kódu kde to padá.
- Pechy.cz
- Bronze Partner | 21
Unlink napsal(a):
Pechy.cz napsal(a):
Každopádně by mi pomohlo i kdyby měl někdo zkušenosti s tím, proč vůbec tato chyba nastává.
Tohle byl jen takový pokus o „prasácký obejití“ chyby, kterou jsem nedokázal nikdy pochopit, ani vyřešit.
Jsem si 100% jist, že řádek v db existuje, protože tato chyba padne jak se jí zachce, v podstatě jednou za čas a ještě třeba v půlce kódu, kdy to již s řádkem operovalo. Stačí párkrát refresh a zase vše funguje.Prečo tá výnimka vzniká som vysvetľoval tuna
https://forum.nette.org/…es-not-exist#…bol som presvedčený že ten riadok zmizne, ale očividne bude problém ešte niekde inde, ak ten tvoj „hack“ s tým, že si ten riadok načítaš dodatočne funguje (a máš to overené) tak by sa zišla ukážka ako s tým pracuješ, aj keď presne neviem ako funguje YetORM ale možno by sa nám podarilo spraviť nejaký kus kódu kde to padá.
To je právě to, že díky tomu, že se mi nepodařilo odchytit Exception,
nebo možná podařilo, ale došlo tam k jiné chybě, tak nevím jak to moc
dobře funguje.
Hackem neboli „prasárnou“ to nazývám z toho důvodu, že v podstatě
pokud dojde k této chybě, tak si přes funkce, který jsou interní a vůbec
by se na tohle neměli používat, přímo v entitě vlezu znovu do tabulky a
pokusím se ten řádek si stáhnout znovu. Protože jsem počítal s tím, že
je to hodně nahodilá chyba.
Ale jak jsem si teď přečetl, tak to díky cache stejně nepomůže.
Dnes se mi podařilo omylem tuhle chybu vyhodit při vývoji a to další chybou
způsobenou „bordelem v databázi“, protože jsem měl relaci na id, který
mi někdo pod rukama smazal z db a byl spatně nastavenej ON DELETE, takže tam
to id zůstalo.
A díky tomu, že jsem v entitě měl blbou posloupnout podmínek, tak mi to
vrátilo prázdnou entitu, na které když jsem zavolal nějakou funkci, tak
došlo k téhle chybě. Nebo respektive k úplně jiné, protože to byla
prázdá entita, která neměla ani id, tak to spadlo až v tom hacku, který
to zrovna teď odchytilo.
Čímž mě zase ale napadá, jestli to vůbec byla tahle chyba, protože už ty
data nemám, tak se nemůžu podívat, ale vzhledem k tomu, že odchytávám
jakoukoli Exception při getu, tak mohlo jít o jakoukoliv chybu. Spíš si
myslím, že šlo o ->get on null.
Uvidím. Snažím se ten problém řešit už nejmíň rok. Pokud jsem si to
dobře spojil s historií, tak tuhle blbost to dělá celou dobu, jen dříve
to nebylo zachyceno vyjímkou, ale prostě to hodilo Warning .. undefined offset
[…], že to nenašlo sloupeček, což na produkčním se tvářilo díky
warningu napohodu jen to vrátilo prázdná data.
Teď díky exception to považuji za daleko větší problém, obzvlášť,
když se začal objevovat 10× denně.
Editoval Pechy.cz (2. 6. 2016 8:08)