Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Ošetření chyb v PHP

Aktivity
Avatar
maxijoey
Člen
Avatar
maxijoey:19.3.2019 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.3.2019 14:39
Avatar
nekukej
Člen
Avatar
Odpovídá na maxijoey
nekukej:19.3.2019 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.3.2019 22:51
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.3.2019 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.3.2019 7:31
 
Nahoru Odpovědět
20.3.2019 7:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.3.2019 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.3.2019 7:34
 
Nahoru Odpovědět
20.3.2019 7:34
Avatar
maxijoey
Člen
Avatar
Odpovídá na nekukej
maxijoey:20.3.2019 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.3.2019 8:15
Avatar
nekukej
Člen
Avatar
Odpovídá na maxijoey
nekukej:20.3.2019 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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
20.3.2019 11:42
Avatar
maxijoey
Člen
Avatar
Odpovídá na nekukej
maxijoey:20.3.2019 12:22

Hele ono to zdá se funguje. Dík

 
Nahoru Odpovědět
20.3.2019 12:22
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na maxijoey
Peter Mlich:20.3.2019 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.3.2019 15:50
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Peter Mlich
Peter Mlich:20.3.2019 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.3.2019 15:53
Avatar
maxijoey
Člen
Avatar
maxijoey:20.3.2019 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.3.2019 16:51
Avatar
Odpovídá na maxijoey
Tomáš Novotný:20.3.2019 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.3.2019 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.3.2019 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.3.2019 21:15
Avatar
Odpovídá na maxijoey
Tomáš Novotný:21.3.2019 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.3.2019 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.