2010-10-04 77 views
2

如何處理在foreach循環中發生的異常?如果內存超出循環,我可以在for循環中拋出異常嗎?

如果for循環無法正常工作,我想拋出異常。

由於數據量巨大,因爲超出了PHP的內存限制,所以foreach退出。

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

{ 
echo $e; 
} 

這是行不通的。我如何拋出異常?

+4

你能再粘貼一些代碼嗎?就目前而言,我所看到的只是語法錯誤。另外,你的意思是不工作? – BoltClock 2010-10-04 18:36:50

+1

你爲什麼不明白這是一個虛擬代碼? – zod 2010-10-04 18:45:39

+4

@zod你的虛擬代碼是沒用的,也可能被忽略。你可以至少已經做了foreach(){/ *內存限制超過這裏* /}' – meagar 2010-10-04 18:47:46

回答

4

內存超出是一個致命錯誤,不是一個例外,不能用try/catch塊處理。 你需要的是set_error_handler

編輯:如果這不起作用,你可以使用register_shutdown_function作爲最後的手段,並檢查腳本是否被停止和錯誤。

+1

謝謝,這是一個答案。 – zod 2010-10-04 18:46:47

+5

致命錯誤(例如超出內存)未被用戶的土地錯誤處理程序捕獲。所以沒有辦法捕捉到這個錯誤。唯一的方法是在超過內存前檢查內存使用情況... – ircmaxell 2010-10-04 18:54:27

+1

感謝ircmaxell和Alin Purcaru帶領我走入正確的道路。 – zod 2010-10-04 19:02:05

1

我不認爲這是可能的。內存超過是一個致命的不可恢復的錯誤。所以當發生這種情況時應該終止頁面。

但我發現漁獲E_ERROR這個問題:How do I catch a PHP Fatal Error

2

根據你的循環裏面發生了什麼,你可以使用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 
}