Как я могу обработать исключение, происходящее в цикле foreach?
Я хочу бросить свое исключение, если цикл for не работал должным образом.
Поскольку данные огромны, foreach выходит, поскольку предел памяти PHP превышен.
try { foreach() }catch (exception $e) { echo $e; }
Это не работает. Как сделать исключение?
Память превышена – это фатальная ошибка, а не исключение и не может обрабатываться с помощью блоков try / catch. Вам нужен set_error_handler .
EDIT: Если это не работает, вы можете использовать register_shutdown_function в качестве последнего средства и проверить, был ли сценарий остановлен и ошибка.
В зависимости от того, что происходит внутри вашего цикла, вы можете использовать memory_get_usage()
. Это не устранит проблемы, связанные с памятью, но по крайней мере вы можете предотвратить выход PHP из-за превышения memory_limit. Пример:
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 }
Я не думаю, что это возможно. превышение памяти – это смертельная неустранимая ошибка. поэтому страница должна быть прервана, когда это произойдет.
Но я нашел этот вопрос для catch E_ERROR: как поймать PHP Fatal Error