On Sun, 27 Oct 2013 20:43:07 -0700, Victor Hooi wrote: > Hi, > > I'd like to double-check something regarding using try-except for > controlling flow. > > I have a script that needs to lookup things in a SQLite database. > > If the SQLite database file doesn't exist, I'd like to create an empty > database, and then setup the schema. > > Is it acceptable to use try-except in order to achieve this? E.g.: > > try: > # Try to open up the SQLite file, and lookup the required > entries > except OSError: > # Open an empty SQLite file, and create the schema
Yes, that's the right way to do it. > My thinking is that it is (easier to ask forgiveness than permission), > but I just wanted to check if there is a better way of achieving this? > > I'd also be doing the same thing for checking if a file is gzipped or > not - we try to open it as a gzip, then as an ordinary text file, and if > that also fails, raise a parsing error. Correct. The problem with checking in advance is that there is a race condition between checking and the using the file: if database exists: # at this moment, the file is guaranteed to exist # but a moment later, guarantee is no longer valid open database In a multitasking operating system, some other process may have deleted the database. Or changed its name, removed your access privileges, even replaced it with a different file. Apart from hard-to-diagnose bugs, this is also the source of some security vulnerabilities: https://www.owasp.org/index.php/Race_Conditions Scroll down and read the section on "Time of check, time of use race condition". So using a try...except block is precisely the right solution. -- Steven -- https://mail.python.org/mailman/listinfo/python-list