Unsubscribe On Sat, Apr 29, 2023 at 7:05 PM Chris Angelico <ros...@gmail.com> wrote:
> On Sun, 30 Apr 2023 at 11:58, Chris Green <c...@isbd.net> wrote: > > > > Chris Angelico <ros...@gmail.com> wrote: > > > On Sat, 29 Apr 2023 at 14:27, Kushal Kumaran <kus...@locationd.net> > wrote: > > > > > > > > On Fri, Apr 28 2023 at 04:55:41 PM, Chris Green <c...@isbd.net> wrote: > > > > > I'm sure I'm missing something obvious here but I can't see an > elegant > > > > > way to do this. I want to create a directory, but if it exists > it's > > > > > not an error and the code should just continue. > > > > > > > > > > So, I have:- > > > > > > > > > > for dirname in listofdirs: > > > > > try: > > > > > os.mkdir(dirname) > > > > > except FileExistsError: > > > > > # so what can I do here that says 'carry on regardless' > > > > > except: > > > > > # handle any other error, which is really an error > > > > > > > > > > # I want code here to execute whether or not dirname exists > > > > > > > > > > > > > > > Do I really have to use a finally: block? It feels rather clumsy. > > > > > > > > > > I suppose I could test if the directory exists before the > os.mkdir() > > > > > but again that feels a bit clumsy somehow. > > > > > > > > > > I suppose also I could use os.mkdirs() with exist_ok=True but again > > > > > that feels vaguely wrong somehow. > > > > > > > > > > > > > Why does exist_ok=True feel wrong to you? This is exactly what it is > > > > there for. > > > > > > > > > > Using mkdirs when you only want to make one is inviting problems of > > > being subtly wrong, where it creates too many levels of directory. > > > Personally, I would just do: > > > > > > try: os.mkdir(dirname) > > > except FileExistsError: pass > > > > > > and not try to handle anything else at all. > > > > > Yes, OP here, that seems to me to be the 'right' way to do it. > > Basically I hadn't realised the effect of pass in a try block and > > that's why I asked the question originally. > > > > There's two points to note here. "pass" doesn't do anything > whatsoever; it's only there to prevent the syntactic problem of having > nothing in that block. This will also suppress the error: > > try: > os.mkdir(dirname) > except FileExistsError: > dummy = "ignore" > > The second thing is that, as soon as you have an "except" clause that > matches the error, that's it - it stops there. The error is considered > handled at that point. If that's NOT what you want, you have a few > options. Firstly, you can simply not have a matching except clause. > That's why we like to be as precise as possible with our catching; > every other type of problem will be left uncaught. Secondly, you can > use "try/finally" to add code that happens as the exception flies by, > but doesn't catch it (it also happens at the end of the block for > other reasons). And thirdly, you can reraise the exception: > > try: > os.mkdir(dirname) > except FileExistsError: > print("Hey, that one already exists!") > raise > > That's going to keep the exception going just as if it hadn't been > caught, but with the additional handling. > > But if you don't do any of those things, the exception is deemed to be > handled, and it goes no further. > > ChrisA > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list