tags:

views:

123

answers:

3

How can I handle an exception happening in a foreach loop?

I want to throw my exception if the for loop didn't work properly.

As data is huge, foreach exits because PHP's memory limit is exceeded.

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

{
echo $e;
}

This is not working. How do I throw an exception?

+3  A: 

Hi,

Memory exceeded is a fatal error, not an exception and cannot be handled with try/catch blocks. What you need is set_error_handler.

EDIT: If that does not work you can use register_shutdown_function as a last resort and check if the script was stopped by and error.

Regards, Alin

Alin Purcaru
thanks , that is an answer.
zod
Fatal errors (such as memory being exceeded) are not captured by user land error handlers. So there is no way to capture said error. The only way would be to check the memory usage prior to it being exceeded...
ircmaxell
thanks ircmaxell and Alin Purcaru to lead me into right way.
zod
+1  A: 

I don't think that is possible. memory exceed is a fatal unrecoverable error. so the page should be terminated when any of this happen.

But I found this question for catch E_ERROR : http://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error

Swing Magic
+2  A: 

Depending on what happens inside your loop, you can use the memory_get_usage() function. This will not fix any memory related issues, but at least you can prevent PHP from exiting due to exceeding the memory_limit. Example:

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
}
Lekensteyn