Search code examples
pythongithooksflake8

Flake8 Not Recognizing built-in exception


I have a strict pre-commit hook set up with flake8, so I can't commit until its happy. This is normally a good thing, but it is causing some problems with what seems like no problem at all.

I can't get Flake8 to recognize a FileNotFoundError.

example.py

try:
    pass
except FileNotFoundError:
    pass

This is enough code to get Flake8 to generate the error

$ flake8 example.py
example.py:3:8: F821 undefined name 'FileNotFoundError'
$ python example.py # no error
$ python3 example.py # no error

I checked the python docs, and FileNotFoundError is a 'built-in' exception, so I don't think I should have to import it from anywhere, and my python interpreters have not complained about it, just seems like an issue with flake8.


Solution

  • Running python 2.7.8 I get the follwoing:

     except FileNotFoundError:
     NameError: name 'FileNotFoundError' is not defined
    

    If I change to OSError it works correctly on python 3

    except OSError:
    

    FileNotFoundError is a subclass of OSError in python3

    Using OSError will catch more than just the FileNotFound error in python 3 so you may want to add additional checks.

    For python 2 it is an IOError:

    You can catch the specific error:

    import __builtin__
    
    exc = getattr(__builtin__,"IOError","FileNotFoundError")
    
    try:
        (open("bad_file"))
    except exc:
        pass
    

    Sure there are betters ways but for python 3:

    try:
        f = (open("bad_file"))
    except OSError as e:
        if isinstance(e, FileNotFoundError):
            pass
        else:
            raise e