Not cathing nested StopIteration

Peter Otten __peter__ at web.de
Fri Jul 21 04:53:37 EDT 2017


Antoon Pardon wrote:

> This is python 3.4 on a debian box
> 
> In the code below, line 36 raises a StopIteration, I would have
> thought that this exception would be caught by line 39 but instead
> I get a traceback.
> 
> Did I miss something or is this a bug?

Your code structure is

try:
    raise FileNotFoundError
except FileNotFoundError:
    # try ... except FileNotFoundError inside this handler 
    # omitted as it is only a distraction
    raise StopIteration 
except StopIteration:
    ...

This will only catch StopIteration-s in the first try block (lines 22 and 
23). To handle exceptions in the first except you need another level of 
try...except, either


try:
    try:
        raise FileNotFoundError:
    except FileNotFoundError:
        raise StopIteration
except StopIteration:
    ...


or

try:
    raise FileNotFoundError:
except FileNotFoundError:
    try:
        raise StopIteration
    except StopIteration:
        ...
    else:
        ...

> 
> This is the code:
> 
>     try:                                                             # 21
>         filename = os.path.join(lang_path, lang)                     # 22
>         fl = open(filename)                                          # 23
>     except FileNotFoundError:                                        # 24
>         try:                                                         # 25
>             lst = lang.split('_')                                    # 26
>             prefix = lst[0] + '*'                                    # 27
>             try:                                                     # 28
>                 lst[1] = lst[0].upper()                              # 29
>             except IndexError:                                       # 30
>                 lst.append(lst[0].upper())                           # 31
>             lang = '_'.join(lst)                                     # 32
>             filename = os.path.join(lang_path, lang)                 # 33
>             fl = open(filename)                                      # 34
>         except FileNotFoundError:                                    # 35
>             lang = next(iglob(os.path.join(lang_path, prefix)))      # 36
>             filename = os.path.join(lang_path, lang)                 # 37
>             fl = open(filename)                                      # 38
>     except StopIteration:                                            # 39
>         fl = ()                                                      # 40
> 
> This is the traceback:
> 
> Traceback (most recent call last):
>   File "/home/antoon/src/projecten/richter/translate.py", line 23, in
>   use_lang
>     fl = open(filename)
> FileNotFoundError: [Errno 2] No such file or directory:
> '/home/antoon/src/projecten/richter/locus/nl'
> 
> During handling of the above exception, another exception occurred:
> 
> Traceback (most recent call last):
>   File "/home/antoon/src/projecten/richter/translate.py", line 34, in
>   use_lang
>     fl = open(filename)
> FileNotFoundError: [Errno 2] No such file or directory:
> '/home/antoon/src/projecten/richter/locus/nl_NL'
> 
> During handling of the above exception, another exception occurred:
> 
> Traceback (most recent call last):
>   File "lang_test", line 4, in <module>
>     use_lang("Nederlands")
>   File "/home/antoon/src/projecten/richter/translate.py", line 36, in
>   use_lang
>     lang = next(iglob(os.path.join(lang_path, prefix)))
> StopIteration
> 





More information about the Python-list mailing list