Catch Nette\InvalidStateException neodchytává vyjímku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Pechy.cz
Bronze Partner | 21
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

nn, jako puvod vyjimky se bere misto, kde byla vytvorena instance. ne kde to bylo vyhozeno

Pechy.cz
Bronze Partner | 21
+
0
-

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
+
0
-

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
+
0
-

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)

Pechy.cz
Bronze Partner | 21
+
0
-

No víceméně tady končím a jdu se přesunout do vlákna viz odkaz od Unlink