exceptions and items in a list

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • rbt

    #1

    exceptions and items in a list

    If I have a Python list that I'm iterating over and one of the objects
    in the list raises an exception and I have code like this:

    try:
    do something to object in list
    except Exception:
    pass

    Does the code just skip the bad object and continue with the other
    objects in the list, or does it stop?

    Thanks
  • Andrey Tatarinov

    #2
    Re: exceptions and items in a list

    rbt wrote:[color=blue]
    > If I have a Python list that I'm iterating over and one of the objects
    > in the list raises an exception and I have code like this:
    >
    > try:
    > do something to object in list
    > except Exception:
    > pass
    >
    > Does the code just skip the bad object and continue with the other
    > objects in the list, or does it stop?[/color]

    # skip bad object and continue with others
    for object in objects:
    try:
    #do something to object
    except Exception:
    pass

    # stop at first bad object
    try:
    for object in objects:
    #do something to object
    except Exception:
    pass

    Comment

    • vincent wehren

      #3
      Re: exceptions and items in a list

      rbt wrote:[color=blue]
      > If I have a Python list that I'm iterating over and one of the objects
      > in the list raises an exception and I have code like this:
      >
      > try:
      > do something to object in list
      > except Exception:
      > pass
      >
      > Does the code just skip the bad object and continue with the other
      > objects in the list, or does it stop?
      >
      > Thanks[/color]

      Fire up a shell and try:
      [color=blue][color=green][color=darkred]
      >>> seq = ["1", "2", "a", "4", "5", 6.0]
      >>> for elem in seq:[/color][/color][/color]
      .... try:
      .... print int(elem)
      .... except ValueError:
      .... pass


      and see what happens...

      --
      Vincent Wehren

      Comment

      • rbt

        #4
        Re: exceptions and items in a list

        Andrey Tatarinov wrote:[color=blue]
        > rbt wrote:
        >[color=green]
        >> If I have a Python list that I'm iterating over and one of the objects
        >> in the list raises an exception and I have code like this:
        >>
        >> try:
        >> do something to object in list
        >> except Exception:
        >> pass
        >>
        >> Does the code just skip the bad object and continue with the other
        >> objects in the list, or does it stop?[/color]
        >
        >
        > # skip bad object and continue with others
        > for object in objects:
        > try:
        > #do something to object
        > except Exception:
        > pass
        >
        > # stop at first bad object
        > try:
        > for object in objects:
        > #do something to object
        > except Exception:
        > pass[/color]

        Thanks Andrey. That's a great example of how to do it.

        Comment

        • Peter Hansen

          #5
          Re: exceptions and items in a list

          rbt wrote:[color=blue]
          > Andrey Tatarinov wrote:[color=green]
          >> # skip bad object and continue with others
          >> for object in objects:
          >> try:
          >> #do something to object
          >> except Exception:
          >> pass[/color]
          >
          > Thanks Andrey. That's a great example of how to do it.[/color]

          Actually, it's not really a "great" example, since it catches
          _all_ exceptions that might happen, and quietly ignores
          them. For example, in the following code, you might not
          realize that you've made a typo and none of the items in
          the list are actually being checked, even though there is
          obviously no problem with any of these simple items
          (integers from 0 to 9).

          def fornat_value(va l):
          return '-- %5d --' % val

          L = range(10)
          for val in L:
          try:
          print format_value(va l)
          except Exception:
          pass

          It's almost always better to identify the *specific*
          exceptions which you are expecting and to catch those,
          or not do a simple "pass". See Vincent's response,
          for example, where he explicitly asks only for ValueErrors
          and lets others propagate upwards, to be reported.

          (I realize these were contrived examples, but examples
          that don't mention this important issue risk the propagation
          of buggy code...)

          -Peter

          Comment

          • Steve Holden

            #6
            Re: exceptions and items in a list

            vincent wehren wrote:
            [color=blue]
            > rbt wrote:
            >[color=green]
            >> If I have a Python list that I'm iterating over and one of the objects
            >> in the list raises an exception and I have code like this:
            >>
            >> try:
            >> do something to object in list
            >> except Exception:
            >> pass
            >>
            >> Does the code just skip the bad object and continue with the other
            >> objects in the list, or does it stop?
            >>
            >> Thanks[/color]
            >
            >
            > Fire up a shell and try:
            >[color=green][color=darkred]
            > >>> seq = ["1", "2", "a", "4", "5", 6.0]
            > >>> for elem in seq:[/color][/color]
            > .... try:
            > .... print int(elem)
            > .... except ValueError:
            > .... pass
            >
            >
            > and see what happens...
            >
            > --
            > Vincent Wehren[/color]

            I suspect the more recent versions of Python allow a much more elegant
            solution. I can't remember precisely when we were allowed to use
            continue in an except suite, but I know we couldn't in Python 2.1.

            Nowadays you can write:

            Python 2.4 (#1, Dec 4 2004, 20:10:33)
            [GCC 3.3.3 (cygwin special)] on cygwin
            Type "help", "copyright" , "credits" or "license" for more information.[color=blue][color=green][color=darkred]
            >>> for i in [1, 2, 3]:[/color][/color][/color]
            ... try:
            ... print i
            ... if i == 2: raise AttributeError, "Bugger!"
            ... except AttributeError:
            ... print "Caught exception"
            ... continue
            ...
            1
            2
            Caught exception
            3[color=blue][color=green][color=darkred]
            >>>[/color][/color][/color]

            To terminate the loop on the exception you would use "break" instead of
            "continue".

            regards
            Steve
            --
            Steve Holden http://www.holdenweb.com/
            Python Web Programming http://pydish.holdenweb.com/
            Holden Web LLC +1 703 861 4237 +1 800 494 3119

            Comment

            • vincent wehren

              #7
              Re: exceptions and items in a list

              Steve Holden wrote:[color=blue]
              > vincent wehren wrote:
              >[color=green]
              >> rbt wrote:
              >>[color=darkred]
              >>> If I have a Python list that I'm iterating over and one of the
              >>> objects in the list raises an exception and I have code like this:
              >>>
              >>> try:
              >>> do something to object in list
              >>> except Exception:
              >>> pass
              >>>
              >>> Does the code just skip the bad object and continue with the other
              >>> objects in the list, or does it stop?
              >>>
              >>> Thanks[/color]
              >>
              >>
              >>
              >> Fire up a shell and try:
              >>[color=darkred]
              >> >>> seq = ["1", "2", "a", "4", "5", 6.0]
              >> >>> for elem in seq:[/color]
              >> .... try:
              >> .... print int(elem)
              >> .... except ValueError:
              >> .... pass
              >>
              >>
              >> and see what happens...
              >>
              >> --
              >> Vincent Wehren[/color]
              >
              >
              > I suspect the more recent versions of Python allow a much more elegant
              > solution. I can't remember precisely when we were allowed to use
              > continue in an except suite, but I know we couldn't in Python 2.1.
              >
              > Nowadays you can write:
              >
              > Python 2.4 (#1, Dec 4 2004, 20:10:33)
              > [GCC 3.3.3 (cygwin special)] on cygwin
              > Type "help", "copyright" , "credits" or "license" for more information.[color=green][color=darkred]
              > >>> for i in [1, 2, 3]:[/color][/color]
              > ... try:
              > ... print i
              > ... if i == 2: raise AttributeError, "Bugger!"
              > ... except AttributeError:
              > ... print "Caught exception"
              > ... continue
              > ...
              > 1
              > 2
              > Caught exception
              > 3[color=green][color=darkred]
              > >>>[/color][/color]
              >
              > To terminate the loop on the exception you would use "break" instead of
              > "continue".[/color]

              What do you mean by a more elegant solution to the problem? I thought
              the question was if a well-handled exception would allow the iteration
              to continue with the next object or that it would stop. Why would you
              want to use the continue statement when in the above case that is
              obviously unnecessary?:

              $ python
              Python 2.4 (#1, Dec 4 2004, 20:10:33)
              [GCC 3.3.3 (cygwin special)] on cygwin
              Type "help", "copyright" , "credits" or "license" for more information.[color=blue][color=green][color=darkred]
              >>> for i in [1,2,3]:[/color][/color][/color]
              .... try:
              .... if i == 2: raise AttributeError, "Darn!"
              .... except AttributeError:
              .... print "Caught Exception"
              ....
              1
              2
              Caught Exception
              3[color=blue][color=green][color=darkred]
              >>>[/color][/color][/color]

              Or do you mean that using "continue" is more elegant than using "pass"
              if there are no other statements in the except block?


              Regards,
              --
              Vincent Wehren[color=blue]
              >
              > regards
              > Steve[/color]

              Comment

              Working...