SyntaxError는 파서(parser)가 이해할 수 없는 소스 코드를 만났을 때 발생하는 예외입니다. 이 오류는 모듈을 가져올 때(import), exec()를 호출할 때, 또는 eval() 함수를 실행할 때 나타날 수 있습니다.
SyntaxError 예외가 가지고 있는 속성들을 활용하면, 입력된 코드 중 정확히 어느 부분이 문제를 일으켰는지 파악할 수 있습니다. 주요 속성은 다음과 같습니다.
filename: 오류가 발생한 파일의 이름lineno: 오류가 발생한 줄 번호offset: 해당 줄에서 오류가 시작되는 문자 위치text: 오류를 유발한 실제 코드 문자열
예제 코드
아래 코드는 try-except 구문으로 SyntaxError를 잡아내고, 예외 객체의 속성을 사용해 오류 정보를 출력합니다.
try:
print(eval('six times seven'))
except SyntaxError as err:
print('Syntax error %s (%s-%s): %s' % \
(err.filename, err.lineno, err.offset, err.text))
print(err)실행 결과
Syntax error <string> (1-9): six times seven invalid syntax (<string>, line 1)
코드 설명
eval('six times seven')은 유효한 Python 표현식이 아니기 때문에 파서가 이를 해석하지 못하고 SyntaxError를 발생시킵니다. except 블록에서는 예외 객체 err의 각 속성을 읽어 다음과 같은 정보를 확인할 수 있습니다.
- 오류가 발생한 위치:
<string>(문자열로 전달된 코드이므로 파일명 대신 <string>이 표시됨) - 줄 번호와 오프셋: 1번째 줄의 9번째 문자부터 문제가 시작됨
- 문제가 된 코드:
six times seven
이처럼 SyntaxError를 명시적으로 잡아 처리하면, 단순히 프로그램이 중단되는 것 대신 사용자에게 친절한 오류 메시지를 제공하거나 로그를 남기는 등의 후속 조치를 취할 수 있습니다.