구문 오류와 예외
오류의 종류
- 프로그램 실행 전에 발생하는 오류
- 구문 오류 - Syntax Error
- 프로그램 실행 중에 발생하는 오류
- Runtime Error & Exception
구문 오류
괄호의 개수, 들여쓰기 문제 등으로 프로그램이 실행되기 전에 발생하는 오류
print("따옴표 하나 안닫기)
#result
SyntaxError: EOL while scanning string literal
예외 & 런타임 오류
프로그램이 실행 중 발생하는 오류
print("Hello")
list[1] #리스트 선언 안하고 그냥 접근하기
#result
NameError: name 'list' is not defined
기본 예외 처리
예외를 해결하는 모든 것을 예외 처리(exception handling)라고 부름
- 조건문을 사용하는 방법 → 기본 예외 처리
- try-except 구문을 사용하는 방법
예외 상황 확인하기
number_input_a = int(input("정수: ")
print("반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
print("원의 넓이: ", 3.14*number_input_a**2)
만약 여기서 정수를 넣지 않는다면? → 예외 발생
ValueError: invalid literal for int() with base 10: '정수가 아닌 자료'
#int()가 정수로 바꿀 수 없는 자료형을 받았을 때 나오는 예외코드
조건문으로 예외 처리하기
위 코드는 ‘isdigit()’, 즉 숫자로만 이루어졌는지 확인하여 값이 참일때만 계산을 실시하고 그렇지 않을 땐 정수를 입력하지 않았다고 출력하면 처리가 가능함
number_input_a = int(input("정수: ")
if number_input_a.isdigit():
print("반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
print("원의 넓이: ", 3.14*number_input_a**2)
else:
print("정수를 입력하지 않았어요")
try except 구문
기본구조
try:
예외가 발생할 가능성이 있는 코드
except:
예외가 발생했을 때 실행할 코드
위 코드를 try except 코드로 변환
try:
number_input_a = int(input("정수: ")
print("반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
print("원의 넓이: ", 3.14*number_input_a**2)
except:
print("정수를 입력하지 않았어요")
try except 구문과 pass 키워드
예외가 발생했을 때 프로그램이 강제 종료되는 것을 막는 목적으로 pass 키워드를 자주 사용한다
try:
danger code...
except:
pass
try except else 구문
try except 구문 뒤에 else 구문을 붙여서 사용하면 ‘예외가 발생하지 않았을 때 실행할 코드’를 지정할 수 있다
try:
dangerous code...
except:
code start when error occur
else:
code start when error not occur
finally 구문
try except 구문 가장 마지막에 사용되는 구문으로 예외가 나오든 안나오든 반드시 실행해야되는 코드를 작성할 수 있다
try:
dangerous code
except:
handling exception
else:
codecode...
finally:
run unconditionally
try, except,else,finally 종합 예제
try:
number_input_a=int(input("정수: "))
except:
print("이건 정수가 아닌데")
else:
print("반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
print("원의 넓이: ", 3.14*number_input_a**2)
finally:
print("어떻게든 프로그램은 끝남")
try, except, finally 구문 조합 규칙
- try 구문은 단독으로 사용이 불가능하며 반드시 except 혹은 finally 구문이 와야한다
- else 구문은 반드시 except 구문 뒤에 사용한다
- try + except
- try + finally
- try + except + else
- try + except + finally
- try + except + else + finally
이 외 조합은 SyntaxError: invalid syntax 가 발생함
finally 구문의 쓰임새
반드시 finally를 사용할 필요는 없다
단순히 생각해봐도 굳이 finally를 사용하지 않아도 맨 마지막에 한 줄의 코드로 finally 키워드 사용을 쓸모없게 만들 수 있는 경우가 있다
try 구문 내부에서 return 키워드를 사용하는 경우
그러나 finally 키워드는 함수 & 반복문 안에 있을 때 사용하면 코드가 깔끔해진다
def test():
print("~~~")
try:
print("~~~~~")
return
print("after return")
except:
print("except")
else:
print("else")
finally:
print("finally")
print("end")
test()
#result
~~~
~~~~~
finally
try 구문 내부에 return 키워드가 있어도 함수를 종료하기 전에 반드시 finally 구문을 실행한다. 이는 파일 처리에서 마지막에 파일을 닫는 용도로 많이 사용된다
def write_txt_file(filename, text):
try:
file = open(filename,"w")
return
file.write(text")
except:
print("Error")
finally:
file.close()
write_txt_file("test.txt","Hello")
try 구문 내 return을 만나도 finally 안에 있는 file.close()가 실행되어 파일이 문제없이 닫힌다
반복문과 함께 사용하는 경우
finally 구문은 break로 반복문을 빠져나갈 때에도 반드시 실행된다
while True:
try:
print("try")
break
print("try break")
except:
print("Error")
finally:
print("finally")
print("end")
print("program end")
#result
try
finally
program end
예외 고급
프로그래밍에서 예외가 발생 시 ‘예외 객체’라는 곳에 예외의 정보가 저장됨
예외 객체 사용법
try:
예외 발생 가능성 있는 구문
except 예외 종류 as 예외 객체를 활용할 변수:
예외 발생 시 실행할 구문
예외 객체
- Exception - 모든 예외의 상위 클래스
우리가 자주 보던 invalid literal for int() with base 10: ~~~이나 다른 에러 메세지는 예외 객체에 저장된 것을 터미널에 표시한 것임
try:
number_input_a=int(input("정수: "))
print("반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
print("원의 넓이: ", 3.14*number_input_a**2)
except Exception as exception:
print(type(exception))
print(exception)
#result - 만약 정수가 아닌 것을 넣었을 때
<class 'ValueError'> - #type(exception)
invalid literal for int() with base 10: 'f' - #print(exception)
예외 구분하기
파이썬은 except 뒤에 예외의 종류를 붙임으로써 예외를 구분할 수 있음
try:
code
except 예외 종류:
code
except 예외 종류:
code
exc...
예외 구분 구문과 예외 객체
예외를 구분할 때 각각의 except 구문 뒤에 예외 객체를 붙여 활용할 수도 있다
as 키워드를 사용해 객체를 사용할 변수를 입력하고 사용할 수 있다
list=[12,34,45,56]
try:
number_input = int(input("digit: "))
print("{}번째 요소: {}".format(number_input,list[number_input-1]))
except ValueError as exception:
print("정수 입력하라 했자나")
print(exception)
except IndexError as exception:
print("그만큼 데이터 없어")
print(exception)
입력한 값이 정수가 아니라면 첫번째 except 구문 실행
입력한 값이 인덱스를 뛰어 넘는 위치라면 두번째 except 구문 실행
모든 예외 잡기
모든 예외를 모두 예상하고 except 구문으로 처리하는 건 굉장히 어렵다
따라서 Exception 이라는 모든 예외의 상위 클래스를 사용하여 모든 예외가 except 구문에 걸리게 만들 수 있다
list=[12,34,45,56]
try:
number_input = int(input("digit: "))
print("{}번째 요소: {}".format(number_input,list[number_input-1]))
except ValueError as exception:
print("정수 입력하라 했자나")
print(exception)
except IndexError as exception:
print("그만큼 데이터 없어")
print(exception)
except Exception as exception:
print("미리 파악하지 못한 예외")
print(exception)
위에 있는 ValueError & IndexError 외의 다른 예외가 발생했을 때 마지막에 있는 Exception에서 변수를 잡아 프로그램이 죽지 않게 하는 것이 좋다
raise 구문
프로그램 개발 중 강제로 예외를 발생시키거나 일부로 예외를 발생시키는 경우가 있다
이때 raise 키워드를 사용하여 예외를 강제로 발생시킬 수 있다
raise 예외 객체
사용 방법은 raise 뒤에 예외 객체를 입력하면 된다
'[파이썬]' 카테고리의 다른 글
[파이썬] 외장 모듈 소개와 설치 및 사용법 (Beautifulsoap, Flask) (0) | 2025.02.12 |
---|---|
[파이썬] 모듈의 기초 사용법과 내장 모듈들(sys, math, datetime, time, urllib) 살펴보기 (0) | 2025.02.12 |
[파이썬] 제너레이터와 yield 키워드 (0) | 2025.02.08 |
[파이썬] 파이썬에서 파일 작업하기 (기초) (0) | 2025.02.08 |
[파이썬] 튜플과 람다 (0) | 2025.02.08 |