Hallo,

Ik vraag me eigenlijk af of je een try/catch blok kunt herhalen als ie in de catch terecht komt. En zo ja hoe?

Stel we hebben zoiets als dit:

<?php

public function foo() {
// code
// ...
try {
$some_integer = rand(1,50);
$this->isLowerThanTen($some_integer); // gooit een exception als het getal groter dan 10 is
} catch (Exception $e) {
// getal is groter dan 10 -> ga weer terug naar het begin van de try
}
// code
// ...
}

?>
Kan zoiets?
Wow, hoe kom jij aan al die kennis Dos? Ik snap je verhaal niet helemaal, maar als ik het goed begrijp stapelt er iets op als je telkens dezelfde functie aanroept, en dat gebeurt niet als je een loop gebruikt? Nou, da's een goede tip om te onthouden! :)
Het geldt niet alleen recursion. Als je naar een ander stukje code (subroutine, function, method, een andere naam voor het zelfde idee) springt moet je ergens een broodkruimel neergooien om te weten hoe je weer thuis komt.
Een stack overflow komt omdat je niet een oneindig grote stack kunt maken omdat er niet genoeg atomen voor zijn =[ Dat betekend dat er een groote voor de stack gekozen moet worden. De groote van de stack bepaald weer hoeveel functies diep kunt gaan.

Als je stack 5 adressen kan bevatten zal het volgende dus al een stackoverflow opleveren.

<?php

function1() {
function2();
}

function2() {
function3();
}

function3() {
function4();
}

function4() {
function5();
}

function5() {
function6();
}

function6() {
function7();
}

function1();
?>

Ik heb op school wat (ben absoluut geen expert) spul geleerd over CPU's :p
>> Als je stack 5 adressen kan bevatten zal het volgende dus al een stackoverflow opleveren.

En hoeveel stack adressen kan iets normaal dan bevatten? 5 lijkt me niet echt veel...
Oh, je kan gerust 200 levels diep gaan binnen PHP. En PHP is geschreven in C, dus dat zal nog heel wat meer zijn, hoeveel hangt van het OS, start parameters en mogelijk nog wat dingen af.
Bij simpele (recursieve) code hoef je hier vaak geen rekening mee te houden. Maar als de recursie uit de hand begint te lopen zou je je af moeten gaan vragen of het tijd is om te refacteren.
Ah oke...nou, thanks voor de tips in ieder geval :) Ik zal het in m'n achterhoofd houden!

Reageren