안녕하세요, 다람쥐입니다.
이번 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?
잘못된 변수명을 입력할 때 제대로 된 변수명을 언어단에서 지원해줍니다.
댓글