- 디버깅
- 에러와 예외
- 예외 처리
- 예외 발생 시키기
💡여러 줄의 소스 코드 한꺼번에 주석(#) 처리하기
ctrl + /
- 디버깅 오류 해결하기
- 제어가 되는 시점에서 내가 원하는대로 제어가 되고 있는지 확인하자
-
디버깅이란?
- 벌레 죽이기! 컴퓨터 오류를 찾아서 해결하기!
- branches 모든 조건이 원하는대로 동작하는지
- for loops 반복문에 진입하는지, 원하는 횟수만큼 실행되는지
- while loops for loops와 동일, 종료조건이 제대로 동작하는지
- function 함수 호출시, 함수, 파라미터, 함수 결과
-
디버깅 방법
"코드의 상태를 신중하게 출력해가며 심사숙고하는 것보다 효과적인 디버깅 도구는 없습니다."
ㅡ 브라이언 커니핸, Unix for Beginners
print함수 활용- 특정 함수 결과, 반복/조건 결과 등 나눠서 생각, 코드를 bisection으로 나눠보기
- 개발 환경(text editor, IDE) 등에서 제공하는 기능 활용
- [VS Code] breakpoint, 변수 조회 등
- Python tutor 활용 (단순 파이썬 코드인 경우)
- 뇌컴파일, 눈디버깅
-
[VS Code] breakpoint 활용한 디버깅
-
launch.json파일 만들기-
왼쪽 메뉴에서 실행 버튼과 BUG 모양 버튼을 누름
-
launch.json 파일 만들기누르면 오른쪽 이미지처럼디버그 구성 선택창이 뜸 -
Python 파일선택
-
-
중단점 설정
- 디버그 중 확인하고 싶은 line 에 중단점 생성
- 확인하고 싶은 line 번호의 왼쪽에 마우스를 올리면 빨간점 표시
- 빨간점 클릭하면
중단점생성
-
디버그 실행 및 도구모음 버튼 의미
- 왼쪽 메뉴에서 디버그 창을 선택, 위쪽 초록색 버튼을 누르면 디버그 실행
- 왼쪽 창에서 현재 변수의 값 확인 가능
- 중앙 위에 나오는 버튼이 도구모음. 각 버튼은 아래의 의미 담고있음
continue: 다음 중단점까지 실행step over: 한 줄 실행. 함수가 있으면 실행 후 넘어감(내부로 들어가지 않음)step into: 한 줄 실행. 함수 내부로 들어감step out: 한 줄 실행. 함수 내부에 있다면 함수를 끝까지 실행시키고 호출시킨 곳으로 돌아감restart: 디버그 다시 시작stop: 디버그 중지
-
-
문법 에러 (
Syntax Error)-
발생하면 쉽게 고칠 수 있음. 파이썬 프로그램은 실행이 되지 않음
-
파일이름, 줄번호,
^문자를 통해 파이썬 코드를 읽어 나갈 때(parser) 문제가 발생한 위치를 표현(코드에 힌트가 있으니 그 라인 시점을 보고 고치기) -
줄에서 에러가 감지된 가장 앞의 위치를 가리키는 캐럿(caret)기호(
^)를 표시 -
문법 에러의 다양한 사례 ▽
[invalid syntax] if else # File "<ipython-input-1-f8a097d0a685>", line 1 # if else ^ # Syntax Error: invalid syntax [EOL (End of Line)] print('hello # File "<ipython-input-6-2a5f5c6b1414>", line 1 # print('hello # ^ # SyntaxError: EOL while scanning string literal [EOF (End of File)] print( # File "<ipython-input-4-424fbb3a34c5>", line 1 # print( # ^ # SyntaxError: unexpected EOF while parsing [assign to literal] 5 = 3 # File "<ipython-input-28-9a762f2c796b>", line 1 # 5 = 3 # ^ # SyntaxError: cannot assign to literal
-
-
예외 (
Exception)-
실행 도중 예상치 못한 상황을 맞이하면, 프로그램 실행을 멈춤
- 문장이나 표현식이 문법적으로 올바르더라도 발생하는 에러
-
실행 중에 감지되는 에러들을 예외라고 부름
-
예외는 여러 타입(type)으로 나타나고, 타입이 메시지의 일부로 출력됨
NameError,TypeError등은 발생한 예외 타입의 종류(이름)
-
모든 내장 예외는 Exception Class를 상속받아 이뤄짐
-
사용자 정의 예외를 만들어 관리할 수 있음
-
-
예외의 다양한 종류
ZeroDivision Error0으로 나누고자 할 때 발생NameErrornamespace 상에 이름이 없는 경우TypeError타입 불일치 / arguments 부족 / argument 개수 초과ValueError타입은 올바르나 값이 적절하지 않거나 없는 경우IndexError인덱스값이 범위를 벗어났을 경우KeyError특정 딕셔너리에 존재하지 않는 키값을 입력했을 경우ModuleNotFoundError존재하지 않는 모듈을 import 하는 경우ImportErrorModule은 있으나 존재하지않는 클래스/함수를 가져오는 경우IndentationError들여쓰기가 적절하지 않은 경우KeyboardInterrupt임의로 프로그램을 종료하였을 때
while True: print(1) # 위의 결과값이 무한하게 반복될 때, 터미널에서 ctrl+c 누르면 작업종료 가능!
💡with base 10 == 10진수로 봤을 때
-
예외처리
- 가장 중요한 개념이 예외 처리를 할 수 있는 구문이 따로 있다는 점!
- 파이썬에서는
try문(statement),except절(clause) 2가지 - 지금은 출력으로 예외 처리를 공부하고 있지만, 실제 현업에서는 예외 처리 부분에 특정한 기능들이 들어가게 됨
-
try문 &except절try문- 오류가 발생할 가능성이 있는 코드를 실행
- 예외가 발생되지 않으면,
except없이 실행 종료
except절- 예외가 발생하면,
except절이 실행됨 - 예외 상황을 처리하는 코드를 받아서 적절한 조치를 취함
- 예외가 발생하면,
- [주의]
try문은 반드시 한 개 이상의except절이 필요 - 작성 방법 ▽
try: <try 명령문> : 검증하고 싶은 코드를 실행하는 부분 except 예외그룹-1 as 변수-1 : <예외처리 명령1> - try 문에서 예외가 발생했을 때 실행 except 예외그룹-2 as 변수-2 : <예외처리 명령2> - try 문에서 또 다른 예외가 발생했을 때 실행 # 하단의 finally: 이하는 선택사항 finally: <finally 명령문> - 예외 발생 여부와 관계없이 항상 실행
-
단일 예외 처리 예시
num = input('숫자입력 : ') print(int(num)) # 위와 같은 코드를 작성했을 때, # 입력 값에 '3'을 넣으면 정상적으로 '3'이 출력되지만, # 입력 값에 '안녕'을 넣으면 int 변환이 될 수 없기 때문에 # ValueError 발생 # 따라서 아래와 같이 예외 처리 코드를 작성 try: num = input('숫자입력 : ') print(int(num)) except: print('숫자가 아닙니다') try: num = input('숫자입력 : ') print(int(num)) except ValueError: print('숫자가 아닙니다')
-
복수의 예외 처리 실습
-
Q: 100을 사용자가 입력한 값으로 나누고 출력하는 코드를 작성해보시오
(먼저, 발생 가능한 에러가 무엇인지 예상해보기)
num = input('100으로 나눌 값을 입력하시오 : ') print(100/int(num)) # 발생 가능한 에러: num에 문자를 입력할 때, num에 0을 입력할 때 # 따라서 아래와 같이 예외 처리 코드를 작성 # 발생 가능한 에러를 모두 명시 try: num = input('100으로 나눌 값을 입력하시오 : ') 100/int(num) except (ValueError, ZeroDivisionError): print('제대로 입력해줘') # 각각의 에러에 따라 별도의 에러 처리 try: num = input('100으로 나눌 값을 입력하시오 : ') 100/int(num) except ValueError: print('숫자를 넣어주세요') except ZeroDivisionError: print('0으로 나눌 수 없습니다') except: print('무슨 에러인지 모르지만 에러가 발생하였습니다')
-
-
예외 처리의 실제 예시
- 파일을 열고 읽는 코드를 작성하는 경우
- 파일 열기 시도
- 파일 없는 경우 → '해당 파일이 없습니다' 출력
except - 파일이 있는 경우 → 파일 내용을 출력
else
- 파일 없는 경우 → '해당 파일이 없습니다' 출력
- 해당 파일 읽기 작업 종료 메시지 출력
finally
- 파일 열기 시도
try: f = open('nooofile.txt') except FileNotFoundError: print('해당 파일이 없습니다') else: print('파일을 읽기 시작합니다') print(f.read()) print('파일을 모두 읽었습니다') f.close() finally: print('파일 읽기를 종료합니다')
- 파일을 열고 읽는 코드를 작성하는 경우
-
raisestatementraise를 통해 예외를 강제로 발생 ▽
raise <표현식> (메시지) # 위 <표현식> 자리에 예외 타입을 지정 # 예외 타입이 주어지지 않을 경우 # 현재 스코프에서 활성화된 마지막 예외를 다시 일으킴 raise # ------- # RuntimeError Traceback (most recent call last) # ----> 1 raise # RuntimeError: No active exception to reraise
- 어떤 코드를 입력해도 그 다음 줄에
raise를 넣으면 무조건 에러 코드가 뜸 - 파이썬 실제 소스 코드에 엄청 많이 들어있음
- 파이썬을 쓰는 사람들에게 잘못된 코드들이 오류라는 것을 알려주기 위한 용도
- 다만, 지금은 에러 메세지를 잘 해석하는데 집중해서 공부하자!
- 파이썬에 기본적으로 내장되어 있는 안내문도 같이 프린트 해보고 싶다면?
err활용!