Why this script can work?

Jm lists practicalperl at gmail.com
Fri Jan 19 05:54:33 EST 2007


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.

2007/1/19, Diez B. Roggisch <deets at nospam.web.de>:
> Jm lists wrote:
>
> > 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 <variable>
>
> > 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
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list