Autor Zpráva
aDAm
Profil
Je nějak zadefinováno kolik exceptions může skript vyhodit během jednoho životního cyklu?

Narazil jsem totiž na problém kdy do db ukládám záznamy po jednom a nemůžu jich tam hodit více jak 13. Každý z těchto insertů generuje exception protože mu chybí cizí klíče (to je ok) tahle exception je chycena, provedeny operace a znovu vyhozena a chycena o úroveň výše a zde opět chycena, provedeny operace a znova vyhozena pak je opět chycena, zase nějaké operace, logy atd a vyhozena a dále možná ještě jednou vyhozena (to už je nad mou úrovní)

Když se pokusím dělat insert pro 13 záznamů tak je vše korektní a skript doběhne správně se všemi výjimkami, když jich tam ale hodím 14 a více tak to pak zkolabuje při tom vyhazování.

Mám phpko nějaký limit kolik se jich může max vyhodit?
ShiraNai7
Profil
aDAm:
Pod „zkolabuje“ si máme představit co?
Joker
Profil
aDAm:
Nevidím důvod, proč by nějaký případ vyhození výjimky měl být ovlivněný tím, jestli a kolikrát byla jinde vyhozená jiná výjimka.

Nevnořují se tam spíš jiná data, kde by něco přeteklo, nebo tak?
aDAm
Profil
ShiraNai7:
no ukončí to běh nestandardním způsobem

Joker:
No právě nechápu co a kde. Leda by přetekla nějaká interní proměnná co se stará o tu databázi která by způsobila celkové zastavení skriptu resp by stopla ten vykonávací controler (appka je na CodeIgniteru :()
DJ Miky
Profil
no ukončí to běh nestandardním způsobem

Nějaká chybová hláška v logu?
aDAm
Profil
Bohužel log je pro admina sprosté slovo :( snad ho přesvědčím ať mě ho pošle.
Camo
Profil
A na localhoste máš v logu čo?
aDAm
Profil
Camo:
localhost nemám, pracuje se na dev serveru.

DJ Miky:
no podařilo se mi dostat k logů, a konečně jsem zjistil že to je nějaký problém SQL relay které si myslí že padlo connection tak neví co má dělat :(
Camo
Profil
aDAm:
Ma tak napadá, keď čítam o tých tvojich výnimkách, že ten kód musí už na prvý ohľad vyzerať otrasne. Nechcel by si to prepísať do normálnej podoby? Predpokladám, že nepíšeš v PHP program pre riadenie vesmírneho strediska.
aDAm
Profil
Camo:
A co se ti na výjimkách nelíbí? Mě se to zase zdá poměrně elegantní jak řešit problém když nastane chyba. Když to vemu od konce tak SQL procedura vyvolá chybu protože ji něco vadí, tuto chybu předá objektu co se stará o volání této procedůry, info o tom že nastala chyba předá skriptu který toto volání inicializoval a když ten vidí že došlo k chybě tak provede operace co se mají při chybovém stavu provést, tj. zruší prováděné změny a udělá log.

Dle mě tedy korektní použití a imho správnější něž nějaké návraty typu true/false a jejich ifování atd.
Camo
Profil
aDAm:
Nikde som nepísal, že sa mi nepáčia výnimky. Nepáči sa mi počet vrstiev, ktoré tie výnimky vytvárajú. Ak sa má takých úkonov potom robiť násobne viac ako píšeš ty, tak môžeš naraziť na nejaké limity, ktoré webové scripty proste majú.
Prečo myslíš, že je to správnejšie ako "nejaký návraty" a "ifování"? :)
aDAm
Profil
Camo:
No tak ono to zanoření je více méně logické, controler zavolá model který si připraví data a pak zavola submodely které už volají konkrétní sql proceduru

Správnější je to dle mě proto, protože si můžu vyhodit rozdílné výjimky a ty pak podle typu odchytávat, navíc výjimka je něco co se stát nemá, tudíž když se to stane spustí se procesy co řeší chybu. Řešit to pomocí nějakých návratových hodnot by to bylo dost komplikované.
Camo
Profil
aDAm:
Problém je v tom, že chyba sa môže vyskytnúť hádam kdekoľvek v scripte. A predsa nedávaš každú úlohu do try-catch bloku. Možno by to tak byť malo, ale byť to tak nemusí. Občas sa proste stane, že script zlyhá. ak to nemá vplyv na nejaké platby, tak sa to môže stať ak to neni tvoja vina.
Kcko
Profil
Camo:
A proč ne? Pokud je k tomu důvod tak ano.
Camo
Profil
Kcko:
Nejde o používanie try-catch bloku, ale o to, či je treba to pchať všade kde sa dá. Podľa mňa to znižuje prehľadnosť scriptu.
Joker
Profil
Camo:
Ne všude kde se dá, ale všude kde jsou potřeba. To je podstatný rozdíl.
Kcko
Profil
Camo:
Ne nezpřehlednuje. Když s vyjimkami umíš pracovat tak právě naopak...
Camo
Profil
Joker, Kcko:
A používate vy osobne potlačovanie chýb cez @?
Ja áno.
aDAm
Profil
Camo:
no tak potlačování chyb tímto způsobem je cesta do pekel
Kcko
Profil
Camo:
Nevím jakou to má spojitost s vyjimkami, ale opět, tam kde se to hodí.

Např.
$x = @ file_get_contents(...);
if (!$x)
{
   ...
}

Jinak ne.
Camo
Profil
aDAm:
Prečo sa stále tváriš, že pracuješ pre NASA?
aDAm
Profil
Camo:
eh? Proč mám prasit kod? proč mám kašlat na chyby? Když jsem schopen si toto všechno odhandlovat a nechat aplikaci podle toho fungovat?

Jinak výjimky používám i tam kde k chybě nedojde, ale např daný prvek/obsah neexistuje, tak hodím vyjímku co mi uděla BadRequest a postará se o korektní error page atd...
Joker
Profil
Camo:
Joker, Kcko:
A používate vy osobne potlačovanie chýb cez @?
Ja áno.
Ne. Jedna kapitola učebnice PHP se vcelku obsáhle zabývá tím, proč je to špatně.
Kdo opravdu ví co dělá se ve specifických případech může chovat tak, jak píše Kcko. Učebnice PHP to nezmiňuje, protože ta je pro začátečníky a ti by to neměli používat nikdy.

aDAm:
Prečo sa stále tváriš, že pracuješ pre NASA?
To jako že dobře navrhovat se mají jen složité aplikace a u jednoduché nevadí navrhnout blbě a používat při tom všemožné prasárny?
Gallovo pravidlo říká: Každý složitý fungující systém se vyvinul z jednoduchého fungujícího systému.

Takže aby vůbec mohla existovat složitá dobře navržená aplikace, musí nejdřív někdo vytvořit jednoduchou dobře navrženou aplikaci.
Camo
Profil
Joker:
A iné pravidlo hovorí, že abstrakcie je síce pekné vec, ale keď sa to preženie, tak je to celé naprd. Tak ako s vínimkami v tejto téme.
Joker
Profil
Camo:
Tak @ není žádná abstrakce, prostě stačí je z kódu vyházet.
A pro PHP začátečníky stačí jednoduchá poučka:
Některé PHP konstrukce, jako eval, goto, @, addslashes, stripslashes a možná ještě něco by se našlo, v běžném skriptu nemají co dělat. Pokud je tam máte a neumíte říct, proč je daná situace tak specifická, aby vynucovala porušení toho pravidla, máte to špatně.

(Poznámka: Některé moje vlastní staré kódy @ používají. Tam platí to samé, je to špatně. Prostě jsem v té době neznal dost na to, abych to napsal dobře.)

Ohlevně výjimek, já samozřejmě nevím, jak vypadá aDAmův kód, ale nepředstavoval bych si ho tak, že jedno každé volání bude obalené try-catch.
Camo
Profil
Joker:
Ten aDAmov kód samozrejme nevidím ani ja...
@ naozaj neni abstrakcia...
aDAm
Profil
Joker:
počkej počkej, kde jsem napsal že dobře navrhovat se mají jen složité aplikace?

Kod vám samozřejmě ukázat nemohu, navíc aby byly vidět souvislosti musel bych tady napastovat x řádek a několik tříd, ale více měně každé volání je obaleno try-catch jelikož dané volání má několik stavů které může vrátit - nenalezeny data, chyba zpracování dat, etc. a díky jendotlivým výjimkám je dokáži díky catchi odchytat a korektně zpracovat a zalogovat.
Joker
Profil
aDAm:
počkej počkej, kde jsem napsal že dobře navrhovat se mají jen složité aplikace?
To jsem akorát tak divně ocitoval, jinak to psal (nebo spíš naznačoval) Camo.

více měně každé volání je obaleno try-catch
Počkat, jako fakt? Že celý kód vypadá nějak následovně?
try {
  foo();
}
catch …
try {
  bar();
}
catch …
aDAm
Profil
Joker:
ok ;)
Ne takto ne, nějak takto zjednodušeně:

class FooControl {
  protected $fooModel;
  
  function fooAction()
  {
    ...nacteni dat z requestu, priprava, etc.
    
    try {
      $this->fooModel->storeData()
    } catch (SystemException $e) {
      .. system error handling
    } catch (Exception $e) {
      .. global error handling
    }
  }
}

class fooModel {
  protected $db;
  
  publis function storeData()
  {
    $inut = array(....)
    
    try {
      $this->db->procedure($input);
      $result = $this->db->result();
    } catch (Exception $e) {
      $this->db->rollback();
      
      throw $e
    }
  }
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0