Issue 5641: Local variables not freed when Exception raises in function called from cycle (original) (raw)

Created on 2009-04-01 08:49 by Glin, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
notfreed.py Glin,2009-04-01 08:49 Example simulating issue
Messages (6)
msg84989 - (view) Author: (Glin) Date: 2009-04-01 08:49
Situation: You have a while cycle. inside of it a try-except block and in this try-except block calling a function. Inside of this function raises an exception, with is caught in the try-except block. What happens: Local variables of the function are not freed. (OK, they are freed when the program leaves a function inside of which is the while cycle, or when another exception raises and is caught, but it's not helpful when you have some server program based on infinite while loop or working with a large amount of data). Example: Example program is attached. Output of the example program: While start job() start Creating 1 Catched AttributeError While end While start job() start Creating 2 job() end Deleting 2 While end While start job() start Creating 3 job() end Deleting 3 While end ... As you can see, a variable 'a' created in the first call (which throws an exception) of the 'job' function will never get freed. Imagine that in 'job' function you create a large amount of data, or worse you create a database connection, which will be opened forever. Tested on Python 2.5.2 and 2.7(svn). On the contrary, Python 3.0 does not have this issue (it frees variables of the 'job' function at the end of except: block.) As Python 2.X will be another long time with us, I think it should be fixed to behave correctly (that is as in Python 3.)
msg85025 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2009-04-01 15:51
This is not a question of "correct" behavior, but of documented semantics. We can't change that semantics in 2.x, like we did for 3.x, because many people rely on the exception variable being available after the except clause finishes. Closing as "won't fix."
msg85189 - (view) Author: (Glin) Date: 2009-04-02 10:07
I'm not talking about exception variable, but about the variables in local scope of function job() (in my example it is the variable 'a' of class A). Sorry, if I did not make myself clear.
msg85202 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2009-04-02 14:17
I know, but that object is kept alive by the frame object that is kept alive by the exception assigned to "e".
msg89306 - (view) Author: Nikolaus Rath (nikratio) * Date: 2009-06-12 22:43
I just spend several days figuring out a problem that was caused by this behaviour and in the process I really tried to read everything that relates to destruction of objects and exception handling in Python. Georg, could you give me a pointer where exactly these semantics are documented? Thanks!
msg89449 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2009-06-17 09:40
Well, it's the basic principle that an object is not destroyed until there are no more references to it. The documented semantics I referred to are that a variable assigned to in an "except X, Y" clause lives beyond the scope of that clause.
History
Date User Action Args
2022-04-11 14:56:47 admin set github: 49891
2009-06-17 09:40:30 georg.brandl set messages: +
2009-06-12 22:43:14 nikratio set nosy: + nikratiomessages: +
2009-04-02 14:17:22 georg.brandl set status: open -> closedmessages: +
2009-04-02 10:07:51 Glin set status: closed -> openmessages: +
2009-04-01 15:51:10 georg.brandl set status: open -> closednosy: + georg.brandlmessages: + resolution: wont fix
2009-04-01 08:49:37 Glin create