Předvánoční slevová akce PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Diskuze: Ošetření chyb v PHP

Aktivity (2)
Avatar
maxijoey
Člen
Avatar
maxijoey:19. března 14:39

Potřeboval bych nějak ošetřit chyby kde dojde k nějakému nepřevídanému fatal erroru tak aby kod dokázal pokračovat dál. Modelově mám cyklus:

for($i=0;$i<3­2;$i++)
{
funkce1();
funkce1();//tady vznikne chyba, někde v půlce cyklu třeba.
funkce1();

}

Jde mi o to že chyba co může nastat, je taková, co nečekám že vůbec může nastat. Jak takovou chybu detekovat?

Zkusil jsem: Zkoušel jsem na to jít přes vyjímky, ale bud jsem je nepochopil, nebo jsou na nic, pokud vyjímky musím sám odpalovat nějakou svou detekcí chyb a následným voláním throw. To pak jsem u problému že musím vědět co se může stát. Tudíž stejně musím neustále všude ifovat a kontrolovat vše.

Chci docílit: Jak zařídím aby se script s chybou vypořádal a pokračoval v dalším cyklu?

 
Odpovědět
19. března 14:39
Avatar
nekukej
Člen
Avatar
Odpovídá na maxijoey
nekukej:19. března 22:51

Záleží co myslíš tou chybou?

Možná:

for($i=0;$i<32;$i++)
{
 funkce1();
 try{
  funkce1();//tady vznikne chyba, někde v půlce cyklu třeba.
 }catch(\Exception $exception){
  // V tento okamžik nastala nějaká chyba
  // Můžeš něco vykonat nebo taky nic a program bude pokračovat na volání další funkce
 }
 funkce1();
}

Spíš jsem dej konkrétní kód, než tenhle pseudo - pokud ti nejde pouze o terorii.

 
Nahoru Odpovědět
19. března 22:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20. března 7:31

Zalezi na tom, jak to chces mit resene.

  1. Pokud chces resit vnejsi funkce jako celek (takovy priklad tam zrovna neni) nebo po jedne (p

7 - ohcc at 163 dot com) a nebo jeste neco uvnitr (Example #3).


http://php.net/manual/en/language.exceptions.php
<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo "Hello World\n";
?>

V tomto examplu, kdyz nastane chyba, tak vyhodi exception, ten if. A nasledne ti to exception zachyti dalsi try To if tam ale nemusi byt. Jenze, pak ti vyhodi error return 1/$x; To bys pak musel dat do try.

for (...)
try {
    $x = 1/$i;
} catch (Exception $e) {
    break; // kdyz nastane chyba, ukonci cyklus
}

---

Hele, ale ify bys prave resit mel. Vsechny situace bys mel predvidat. V opacnem pripade bych takovy program nechtel zaplatit, smazal a poslal te jinam.


  1. A jeste muzes zachytavat vsechny exception
function exceptions_error_handler($severity, $message, $filename, $lineno) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
}

set_error_handler('exceptions_error_handler');
?>

  1. A nebo muzes chyby potlacovat, v tom pripade by ale cyklus pokracoval dal a neprerusil se 'break'-em. To by melo smysl treba v pripade session nebo include. Ale pak ti take nemusi session spravne fungovat.
@$x = 1/$i;
// @session_start();
// @include 'file.php';
Editováno 20. března 7:31
 
Nahoru Odpovědět
20. března 7:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20. března 7:34
function exceptions_error_handler($severity, $message, $filename, $lineno) {
//    throw new ErrorException($message, 0, $severity, $filename, $lineno);
$msg     = "$message, 0, $severity, $filename, $lineno";
$headers = '...';
mail('adresa', 'chyba ze stranky', $msg, $headers)
}

set_error_handler('exceptions_error_handler');
?>
Editováno 20. března 7:34
 
Nahoru Odpovědět
20. března 7:34
Avatar
maxijoey
Člen
Avatar
Odpovídá na nekukej
maxijoey:20. března 8:15

Nekoukej, konkrétního kodu je hromada, proto ten pseudokod pro pochopeni. A jde mi hlavně o fatal errory a to jsem psal :-) V tvem příkladu, to jsem právě zkoušel co píšeš, při fatal erroru to nefunguje script končí. Nedonutím ho pokračovat.

Peter Milch Zavináče používám na jednom možná dvou míctech, jedno je autoloader druhé už nevím :-) Ten příklad s error handlerem nebo podobný na ten jsem narazil a je fakt ze takto:

function shutdown_error() {
$error = error_get_last();
if ($error['type'] & (E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_PARSE)) {
echo("Nastala chyba");
}
}
register_shut­down_function('shut­down_error');

to umi fatal error detekovat. Ale nedaří se mi ho přesvědčit aby v cyklu pokračoval. Jinak ao ifuju kde můžu, ale je toho moc a občas se stane že fakt něco nepředvídáš a měl jsem právě za to, že na to jsou vyjímky. V takovým C# to tuším tak funguje. Co si pamatuju. Nebo to tam je prošpikovaný odpalováním vyjímek už v v základu dotnetu nevim. Jen vím že tam mi to pomáhalo, tady si to ošetřit spíš přidělá práci.. Nevidím proto moc velký rozdíl mezi ifama a vyjímkama.

Jediné co mě napadá je ukládat si číslo pruchodu cyklem nekam do souboru nebo db. Pokud detekuju fatalerror tak script naikludovat znovu s tím že se podívá kde skočil a nastaví začátek na další cyklus. Ale nevím aby to nebyla cesta někam do prdele.

 
Nahoru Odpovědět
20. března 8:15
Avatar
nekukej
Člen
Avatar
Odpovídá na maxijoey
nekukej:20. března 11:42

Zmínku o fatal jsem nějak přehlédl, tak tím pádem místo \Exception odchytni \Error nebo můžeš \Throwable - to by mělo odchytit jak errory tak všechny výjimky. -> za předpokladu, že používáš PHP 7. (Akorát to nemám odzkoušené, tak to můžeš vyzkoušet a uvidíš)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
20. března 11:42
Avatar
maxijoey
Člen
Avatar
Odpovídá na nekukej
maxijoey:20. března 12:22

Hele ono to zdá se funguje. Dík

 
Nahoru Odpovědět
20. března 12:22
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na maxijoey
Peter Mlich:20. března 15:50

'je toho moc a občas se stane že fakt něco nepředvídáš'
To se mi opravdu nestava. Obvykle predvidam vsechno.

Problem je, ze mozna neumis spravne osetrit vstupni hodnoty.

V prikladech na netu se na osetrovani vstupu nehledi, protoze je to kod navic, ktery priklad zneprehlednuje. Podobne ve skole. V praxi to proste jinak nejde. Dobry program nesmi uzivateli zhavarovat. Jinak je to jen laciny sunt, jakych je 99.9% programu. Za maly peniz, rychle udelany, nejakym studentikem. Pak neni problem to hacknout 10 letym skolakem podle navodu na netu.

 
Nahoru Odpovědět
20. března 15:50
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
Peter Mlich:20. března 15:53

Ale nektere stavy neosetruji. Ty vsak nezpusobi pad programu, jenom dovoli ulozit nesmysly nebo pisou nesmysly o chybe, ikdyz uzivatel nevyplnil zatim policko.

 
Nahoru Odpovědět
20. března 15:53
Avatar
maxijoey
Člen
Avatar
maxijoey:20. března 16:51

Vstupy mam ošetřené dobře snad. Samotný program co klienti používají mi nepadá. To je naprosto v cajku. Ale některé krony zpracovávající data co běží třeba 18x děnně a data načítají z jiných zdrojů, které se mohou měnit a občas do toho zdroje je zanesena chyba, tam mi to občas kolabuje a to se snažím ošetřit. A věř mi že tam fakt nevyčucháš všechno co se ti může stát. Pokaždé mě nějaký zdroj něčím překvapí co do toho zanesou z nenadání.

 
Nahoru Odpovědět
20. března 16:51
Avatar
Odpovídá na maxijoey
Tomáš Novotný:20. března 18:26

Možná hloupý dotaz. Ale nebylo by smysluplnější tomu předcházet validací zdroje, než řešit někde v průběhu následky vyskytující se nahodile?

Nahoru Odpovědět
20. března 18:26
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
maxijoey
Člen
Avatar
maxijoey:20. března 21:15

Tomáši ,také pravda. Ale nevím jak přesně aby to to bylo na tuti. Zdrojů je momentálně 80 cca a nejsou pravidla jak má vypadat. Samozřejmě jisté věci jako existenci dat,proměnných, položek a kontrolu kde čeho už jsem nasadil, ale stále to nemusí stačit.

 
Nahoru Odpovědět
20. března 21:15
Avatar
Odpovídá na maxijoey
Tomáš Novotný:21. března 6:07

hmmm, jak tedy zpracováváš zdroj, když pro něj neexistují strukturální a typová pravidla? k čemu ti tedy tyto zdroje jsou, když přesně nevíš jaká data z nich získáš? asi nějak nerozumím jak to funguje...
z mého pohledu v obecné rovině je jedno odkud data jsou... stejně bys je měl validovat jako se tomu děje např. u formulářů
buď tedy podle primitivních datových typů daného jazyka, nebo pak podle uživatelsky definovaných datových typů - tam se dá využít např. regulárních výrazů
za mne se jako rozumnější jeví pokud počáteční validace selže - a vyhnu se tak fatal erroru někde v průběhu..
reálným příkladem buď např. import bankovních výpisů do účetnictví - ikdyž takovéto zdroje bývají vcelku dobře dokumentované k aktualizaci struktury i tak může dojít...

Nahoru Odpovědět
21. března 6:07
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.