Catching a specific IO error

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

    #1

    Catching a specific IO error

    Hi group :)

    I have this standard line:

    export = open(self.expor tFileName , 'w')

    'exportFileName ' is a full path given by the user. If the user gives an
    illegal path or filename the following exception is raised:
    "IOError: [Errno 2] No such file or directory: /some/path/file.txt"

    So at the moment I do this:

    try:
    export = open(self.expor tFileName , 'w')
    export.write("S omething")
    export.close()
    except IOError:
    # calling an error handling method.

    Now, this works but of course it catches every IOError, and I can not
    figure out how to restrict it to only catch the "[Errno 2]"?

    Thanks
    Tina

  • =?ISO-8859-1?Q?Thomas_Kr=FCger?=

    #2
    Re: Catching a specific IO error

    Tina I schrieb:
    Now, this works but of course it catches every IOError, and I can not
    figure out how to restrict it to only catch the "[Errno 2]"?
    There's an example that uses the error number:


    Thomas


    --
    sinature: http://nospam.nowire.org/signature_usenet.png

    Comment

    • Gabriel Genellina

      #3
      Re: Catching a specific IO error

      En Tue, 24 Apr 2007 08:44:05 -0300, Tina I <tinaweb@bestem selv.com>
      escribió:
      Hi group :)
      >
      I have this standard line:
      >
      export = open(self.expor tFileName , 'w')
      >
      'exportFileName ' is a full path given by the user. If the user gives an
      illegal path or filename the following exception is raised:
      "IOError: [Errno 2] No such file or directory: /some/path/file.txt"
      >
      So at the moment I do this:
      >
      try:
      export = open(self.expor tFileName , 'w')
      export.write("S omething")
      export.close()
      except IOError:
      # calling an error handling method.
      >
      Now, this works but of course it catches every IOError, and I can not
      figure out how to restrict it to only catch the "[Errno 2]"?
      You can get the 2 as the errno exception attribute. BTW, 2 == errno.ENOENT

      try:
      export = open(self.expor tFileName , 'w')
      except IOError, e:
      if e.errno==errno. ENOENT:
      # handle the "No such file or directory" error
      # calling an error handling method.

      See http://docs.python.org/lib/module-exceptions.html

      --
      Gabriel Genellina

      Comment

      • Steve Holden

        #4
        Re: Catching a specific IO error

        Thomas Krüger wrote:
        Tina I schrieb:
        >Now, this works but of course it catches every IOError, and I can not
        >figure out how to restrict it to only catch the "[Errno 2]"?
        >
        There's an example that uses the error number:

        >
        So what you'll need to do is catch all IOError exceptions, then test to
        see if you've got (one of) the particular one(s) you are interested in.
        If not then you can re-raise the same error with a bare "raise"
        statement, and any containing exception handlers will be triggered. If
        there are none then you will see the familiar traceback termination message.

        regards
        Steve
        --
        Steve Holden +1 571 484 6266 +1 800 494 3119
        Holden Web LLC/Ltd http://www.holdenweb.com
        Skype: holdenweb http://del.icio.us/steve.holden
        Recent Ramblings http://holdenweb.blogspot.com

        Comment

        • Steven Howe

          #5
          Re: Catching a specific IO error

          Steve Holden wrote:
          Thomas Krüger wrote:
          >
          >Tina I schrieb:
          >>
          >>Now, this works but of course it catches every IOError, and I can not
          >>figure out how to restrict it to only catch the "[Errno 2]"?
          >>>
          >There's an example that uses the error number:
          >http://docs.python.org/tut/node10.ht...00000000000000
          >>
          >>
          So what you'll need to do is catch all IOError exceptions, then test to
          see if you've got (one of) the particular one(s) you are interested in.
          If not then you can re-raise the same error with a bare "raise"
          statement, and any containing exception handlers will be triggered. If
          there are none then you will see the familiar traceback termination message.
          >
          regards
          Steve
          >
          you could also use some pre-testing of the filename os.path.isfile,
          os.path.isdir, os.path.split are good
          functions to test file/directory existence. Also to verify that you have
          permission to manipulate a file, os.access is a good function.
          sph


          Comment

          • Michael Hoffman

            #6
            Re: Catching a specific IO error

            Steven Howe wrote:
            Steve Holden wrote:
            >Thomas Krüger wrote:
            >>
            >>Tina I schrieb:
            >>>
            >>>Now, this works but of course it catches every IOError, and I can not
            >>>figure out how to restrict it to only catch the "[Errno 2]"?
            >>>>
            >>There's an example that uses the error number:
            >>http://docs.python.org/tut/node10.ht...00000000000000
            >>>
            >>>
            >So what you'll need to do is catch all IOError exceptions, then test
            >to see if you've got (one of) the particular one(s) you are interested
            >in. If not then you can re-raise the same error with a bare "raise"
            >statement, and any containing exception handlers will be triggered. If
            >there are none then you will see the familiar traceback termination
            >message.
            >>
            >regards
            > Steve
            >>
            you could also use some pre-testing of the filename os.path.isfile,
            os.path.isdir, os.path.split are good
            functions to test file/directory existence. Also to verify that you have
            permission to manipulate a file, os.access is a good function.
            The try first approach is better for at least two reasons:

            1) It saves you an extra stat() on the disk, which can be really
            important for some filesystems I use :)

            2) It is atomic. If os.path.isfile( ) returns True but the file is
            deleted before you open it, you are still going to have to handle the
            exception.
            --
            Michael Hoffman

            Comment

            • John Machin

              #7
              Re: Catching a specific IO error

              On 25/04/2007 4:06 AM, Steven Howe wrote:
              Steve Holden wrote:
              >Thomas Krüger wrote:
              >>
              >>Tina I schrieb:
              >>>
              >>>Now, this works but of course it catches every IOError, and I can not
              >>>figure out how to restrict it to only catch the "[Errno 2]"?
              >>>>
              >>There's an example that uses the error number:
              >>http://docs.python.org/tut/node10.ht...00000000000000
              >>>
              >>>
              >So what you'll need to do is catch all IOError exceptions, then test
              >to see if you've got (one of) the particular one(s) you are interested
              >in. If not then you can re-raise the same error with a bare "raise"
              >statement, and any containing exception handlers will be triggered. If
              >there are none then you will see the familiar traceback termination
              >message.
              >>
              >regards
              > Steve
              >>
              you could also use some pre-testing of the filename os.path.isfile,
              os.path.isdir, os.path.split are good
              functions to test file/directory existence.
              In general, this is laborious, tedious, and possibly even platform
              dependent. Then you still need to wrap the open call in try/accept. Why
              bother?

              In particular, (1) please explain how os.path.split helps with existence
              testing:

              Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit
              (Intel)] on win32
              Type "help", "copyright" , "credits" or "license" for more information.
              | >>import os.path
              | >>os.path.split (r'no\such\path \nothing.nix')
              ('no\\such\\pat h', 'nothing.nix')

              (2) please explain why you avoided mentioning os.path.exists.

              Comment

              • Tina I

                #8
                Re: Catching a specific IO error

                Gabriel Genellina wrote:
                You can get the 2 as the errno exception attribute. BTW, 2 == errno.ENOENT
                >
                try:
                export = open(self.expor tFileName , 'w')
                except IOError, e:
                if e.errno==errno. ENOENT:
                # handle the "No such file or directory" error
                # calling an error handling method.
                >
                See http://docs.python.org/lib/module-exceptions.html
                >
                --Gabriel Genellina
                Perfect! Just what I was looking for. Thank you! :)

                Tina

                Comment

                Working...