Why this script can work?

J

Jm lists

Please help with this script:

class ShortInputException(Exception):
'''A user-defined exception class.'''
def __init__(self,length,atleast):
Exception.__init__(self)
self.length=length
self.atleast=atleast

try:
s=raw_input('Enter something --> ')
if len(s)<3:
raise ShortInputException(len(s),3)
# Other work can continue as usual here
except EOFError:
print '\nWhy did you do an EOF on me?'
except ShortInputException,x:
print 'ShortInputException: The input was of length %d, was
expecting at least %d' %(x.length,x.atleast)
else:
print 'No exception was raised.'


My questions are:

1) ShortInputException,x: what's the 'x'? where is it coming?

2) The 'if' and 'else' are not in the same indent scope,why this can work?

Thanks in advance.
 
D

Diez B. Roggisch

Jm said:
Please help with this script:

class ShortInputException(Exception):
'''A user-defined exception class.'''
def __init__(self,length,atleast):
Exception.__init__(self)
self.length=length
self.atleast=atleast

try:
s=raw_input('Enter something --> ')
if len(s)<3:
raise ShortInputException(len(s),3)
# Other work can continue as usual here
except EOFError:
print '\nWhy did you do an EOF on me?'
except ShortInputException,x:
print 'ShortInputException: The input was of length %d, was
expecting at least %d' %(x.length,x.atleast)
else:
print 'No exception was raised.'


My questions are:

1) ShortInputException,x: what's the 'x'? where is it coming?

except <ExceptionSpec>, <variable>:

will catch an exception of the kind specified in <ExceptionSpec> (it might
actually be more than one), and store the exception object in the variable
named said:
2) The 'if' and 'else' are not in the same indent scope,why this can work?


Because additionally to if, also for and try have else-clauses. The latter
two are only being called if the body of the control structure hasn't been
left due to "unnatural" circumstances. See this:




for i in xrange(10):
pass
else:
print "test 1"

for i in xrange(10):
break
else:
print "test 2"

try:
pass
except:
pass
else:
print "test 3"

try:
raise "I know I shouldn't rais strings..."
except:
pass
else:
print "test 4"



It will only print

test 1
test 3


Diez
 
J

Jm lists

Thanks for all the helps.
I'm not habitual for this usage of 'else',other languages seem don't
support this syntax.
i.g,writting the codes below by Perl would get an error:

# perl -le 'for $i (1..10){print $i} else{print "finished"}'
syntax error at -e line 1, near "}else"
Execution of -e aborted due to compilation errors.
 
D

Diez B. Roggisch

Jm said:
Thanks for all the helps.
I'm not habitual for this usage of 'else',other languages seem don't
support this syntax.
i.g,writting the codes below by Perl would get an error:

I personally consider this part of python also somewhat obscure. But I just
don't use it and don't bother.

Diez
 
G

Gabriel Genellina

I'm not habitual for this usage of 'else',other languages seem don't
support this syntax.
i.g,writting the codes below by Perl would get an error:

[[[censored example]]]

If all languages had the same features, what would be the point of having
different languages at all?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,074
Latest member
StanleyFra

Latest Threads

Top