2010-10-04 9 views
2

Comment puis-je gérer une exception se produisant dans une boucle foreach?Puis-je lancer une exception dans une boucle for, si la mémoire dépasse dans cette boucle

Je souhaite lancer mon exception si la boucle for ne fonctionne pas correctement.

Comme les données sont énormes, foreach se ferme car la limite de mémoire de PHP est dépassée.

try 
{ 
foreach() 
}catch (exception $e) 

{ 
echo $e; 
} 

Cela ne fonctionne pas. Comment lancer une exception?

+4

Pourriez-vous coller un peu plus de code? En l'état, tout ce que je vois sont des erreurs de syntaxe. Aussi, que voulez-vous dire par ne pas travailler? – BoltClock

+1

pourquoi ne comprenez-vous pas que c'est un code factice ?? – zod

+4

@zod Votre code fictif est inutile et pourrait aussi bien avoir été omis. Vous pourriez au moins avoir fait 'foreach() {/ * limite de mémoire dépassée ici * /}' – meagar

Répondre

4

La mémoire dépassée est une erreur fatale, pas une exception et ne peut pas être gérée avec des blocs try/catch. Ce dont vous avez besoin est set_error_handler.

EDIT: Si cela ne fonctionne pas, vous pouvez utiliser register_shutdown_function en dernier recours et vérifier si le script a été arrêté par et erreur.

+1

merci, c'est une réponse. – zod

+5

Les erreurs fatales (telles que le dépassement de la mémoire) ne sont pas capturées par les gestionnaires d'erreurs de terrain de l'utilisateur. Il n'y a donc aucun moyen de capturer cette erreur. Le seul moyen serait de vérifier l'utilisation de la mémoire avant qu'elle ne soit dépassée ... – ircmaxell

+1

remercie ircmaxell et Alin Purcaru de m'avoir conduit dans le droit chemin. – zod

1

Je ne pense pas que ce soit possible. La mémoire dépasse est une erreur fatale irrécupérable. donc la page devrait être terminée quand tout cela arrive.

Mais je trouve cette question pour E_ERROR catch: How do I catch a PHP Fatal Error

2

En fonction de ce qui se passe à l'intérieur de votre boucle, vous pouvez utiliser la fonction memory_get_usage(). Cela ne résoudra aucun problème lié à la mémoire, mais au moins vous pouvez empêcher PHP de quitter en raison du dépassement de memory_limit. Exemple:

try{ 
    $memory_limit = 1*1024*1024; /* 1M, this should be lower than memory_limit */ 
    foreach($something as $anything){ 
     if(memory_get_usage() >= $memory_limit){ 
      throw new Exception('Memory limit exceeded!'); 
     } 
    } 
} 
catch(Exception $ex){ 
    //handle error, optionally freeing memory by unset()-ing unused variables 
} 
Questions connexes