Python/Python 자료실

Python 3.10 릴리즈 노트 #2. 더 나은 예외 메시지

Chipmunks 2022. 2. 7.
728x90

안녕하세요, 다람쥐입니다.

이번 Python 3.10 에서는 예외 메시지가 달라졌다고 하는데요~

어떤 점이 달라졌는지 확인해볼까요?

Better error messages

첫 번째로 괄호와 중괄호, 리터럴 문자열(싱글 ", 트리플 """)이 끝나지 않을 때 모호하던 예외 메시지가 개선 되었습니다.

expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
            38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
some_other_code = foo()

expected 변수에서 중괄호({ )가 끝나지 않다는 걸 주목해주세요!

이전에는 아래와 같이 예외 메시지가 나타났습니다.

File "example.py", line 3
    some_other_code = foo()
                    ^
SyntaxError: invalid syntax

Python 3.10 에서는 더욱 정보가 들어가있습니다.

File "example.py", line 1
    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '{' was never closed

두 번째로 SyntaxError 에서는 문법 오류가 발생한 위치를 한 곳만 표시하는 게 아니라 전체 범위를 표시하도록 변경됐습니다.

변경 전 SytanxError 는 다음과 같습니다.

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^
SyntaxError: Generator expression must be parenthesized

변경 후 SyntaxError 는 다음과 같습니다.

>>> foo(x, z for z in range(10), t, w)
  File "<stdin>", line 1
    foo(x, z for z in range(10), t, w)
           ^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized

`z for z in range(10)

세 번째로 블록을 선언할 때 : 이 없을 때 나타나는 오류입니다.

>>> if rocket.position > event_horizon
  File "<stdin>", line 1
    if rocket.position > event_horizon
                                      ^
SyntaxError: expected ':'

네 번째로 튜플을 선언해야할 때 선언하지 않았다면 나타나는 오류입니다.

>>> {x,y for x,y in zip('abcd', '1234')}
  File "<stdin>", line 1
    {x,y for x,y in zip('abcd', '1234')}
     ^
SyntaxError: did you forget parentheses around the comprehension target?

다섯 번째로 컬렉션 리터럴 사이에 콤마가 없을 때 나타나는 오류입니다.

>>> items = {
... x: 1,
... y: 2
... z: 3,
  File "<stdin>", line 3
    y: 2
       ^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

여섯 번째로 except 구문에서 여러 개의 예외를 괄호 없이 넣었을 때 나타나는 오류입니다.

>>> try:
...     build_dyson_sphere()
... except NotEnoughScienceError, NotEnoughResourcesError:
  File "<stdin>", line 3
    except NotEnoughScienceError, NotEnoughResourcesError:
           ^
SyntaxError: multiple exception types must be parenthesized

일곱 번째로 딕셔너리 리터럴에서 : 괄호와 값이 누락되었을 때 나타나는 오류입니다.

>>> values = {
... x: 1,
... y: 2,
... z:
... }
  File "<stdin>", line 4
    z:
     ^
SyntaxError: expression expected after dictionary key and ':'

>>> values = {x:1, y:2, z w:3}
  File "<stdin>", line 1
    values = {x:1, y:2, z w:3}
                        ^
SyntaxError: ':' expected after dictionary key

여덟 번째로 try 블록이 except 또는 finally 블록이 없을 때 나타나는 오류입니다.

>>> try:
...     x = 2
... something = 3
  File "<stdin>", line 3
    something  = 3
    ^^^^^^^^^
SyntaxError: expected 'except' or 'finally' block

아홉 번째로 조건문에서 == 대신 = 을 사용했을 때 나타나는 오류입니다.

>>> if rocket.position = event_horizon:
  File "<stdin>", line 1
    if rocket.position = event_horizon:
                       ^
SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?

열 번째로 f-문자열에서 가변 인수를 표현하는 * 표현식을 사용했을 떄 나타나는 오류입니다.

>>> f"Black holes {*all_black_holes} and revelations"
  File "<stdin>", line 1
    (*all_black_holes)
     ^
SyntaxError: f-string: cannot use starred expression here

열 한 번째로 IntentationError 예외를 발생할 떄 어떤 블록에 있었는지를 인식해서 오류 메시지를 보여줍니다.

>>> def foo():
...    if lel:
...    x = 2
  File "<stdin>", line 3
    x = 2
    ^
IndentationError: expected an indented block after 'if' statement in line 2

열 두 번째로 AttributeError 예외를 표시할 때 비슷한 속성 이름을 제안해줍니다.

>>> collections.namedtoplo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?

속성 입력 시 오타가 있을 때 제대로 된 속성명을 언어단에서 지원해줍니다.

열 세 번째로 NameErrors 예외를 표시할 떄 비슷한 이름을 제안해줍니다.

>>> schwarzschild_black_hole = None
>>> schwarschild_black_hole
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?

잘못된 변수명을 입력할 때 제대로 된 변수명을 언어단에서 지원해줍니다.

댓글