are variables local only to try/except blocks?

Steve Holden steve at holdenweb.com
Tue Sep 20 17:25:28 EDT 2005


Barry Searle wrote:
> 
> in the case of nested try/except code generation,
> your suggestion could cause a problem:
> # 1) this is fine:
> doInitialStuff  # With no exceptions
> excp = 0
> try:
>     doLotsHere()
> except aParticularSetOfExceptions:
>     excp = 1
> if excp:
>     handleException()
> doLotsMoreStuff()
> 
> # 2) nested code generation has problem:
> doInitialStuff  # With no exceptions
> excp = 0
> try:
> 
>     doMOREInitialStuff  # With no exceptions
>     excp = 0
>     try:
>          doMORELotsHere()
>     except aParticularSetOfExceptions:
>          excp = 1  #### this causes the problem
>     if excp:
>          handleException()
>     doMORELotsMoreStuff()
> 
>      doLotsHere()
> except aParticularSetOfExceptions:
>     excp = 1
> #### excp=1 from inner nested code generation
> if excp:
>     handleException()
> doLotsMoreStuff()
> 
> # 3) Hence I return to my planned template code generation:
> excp = 0 #### Probaly need to do ONCE, to "bind" variable ?

Yes, but I am bothered that you appear to feel there is a need to 1) 
record whether an exception occurred and then 2) handle the exception 
only when you have finished recording whether exceptions occurred and 
under what conditions.

> doInitialStuff  # With no exceptions
> try:
> 
>     doMOREInitialStuff  # With no exceptions

In which case you might as well put the

       excp =0

here.

>     try:
>          doMORELotsHere()
>          excp = 0 ##### always reset excp as last action

That doesn't make sense to me. If an exception isn't raised then excp 
will have the value it's always had, which is to say zero, so I don't 
see why you feel the need for this "resetting" to take place (unless 
there's a chance that doMORELotsHere() changes excp's value).

>     except aParticularSetOfExceptions:
>          excp = 1
>     if excp:
>          handleException()
>     doMORELotsMoreStuff()
> 
>      doLotsHere()
>     excp = 0 ##### always reset excp as last action
> except aParticularSetOfExceptions:
>     excp = 1
> if excp:  #### should be fine
>     handleException()
> doLotsMoreStuff()
> 
> 
[previous insanities deleted]

I don't believe there isn't a simpler way to do what you appear to want 
to do.

Since you are talking about machine-generated code we can agree not to 
care about ugly in terms of source, but I think we should be careful no 
to throw the baby out with the bath water here.

Rather than casting your question as code it may prove helpful simply to 
describe the problem in English, and then see if others on the group 
can't help you structure your code better.

Steve
-- 
Steve Holden       +44 150 684 7255  +1 800 494 3119
Holden Web LLC                     www.holdenweb.com
PyCon TX 2006                          www.pycon.org



More information about the Python-list mailing list