global declaration in except has incorrect prior use

Bug report

Bug description:

I think the global a has no prior use in this code (and pyright tells me the same). But I don't understand why cpython thinks it has a prior use.

a=5

def f():
    try:
        pass
    except:
        global a
    else:
        print(a)

output (Python 3.12.0):

  File "/home/frank/projects/pysource-playground/pysource-codegen/bug.py", line 8
    global a
    ^^^^^^^^
SyntaxError: name 'a' is used prior to global declaration

the following code has no syntax error:

a=5

def f():
    try:
        pass
    except:
        global a
    print(a)

I can also reproduce this issue in 3.7.

I also don't know what the exact semantic of global/nonlocal inside statements like if/while/try/... is. I would like to know more about it because I'm currently writing pysource-codegen where I generate such cases.

CPython versions tested on:

3.12

Operating systems tested on:

Linux

Linked PRs