자격증 시험까지 16시간... 인생 예외처리는 왜 없나요..?
# 구문 오류(SyntaxError)
print("# 프로그램 실행 중")
print("# 구문 오류 유도) # 따옴표로 닫지 않음
File "<ipython-input-1-44209ba4e93b>", line 4
print("# 구문 오류 유도) # 따옴표로 닫지 않음
^
SyntaxError: unterminated string literal (detected at line 4)
# 예외(Exception)
print("# 프로그램 실행 중")
list_a[1]
# 프로그램 실행 중
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-2-548a2ef5156e> in <cell line: 0>()
2 print("# 프로그램 실행 중")
3
----> 4 list_a[1]
NameError: name 'list_a' is not defined
(특이사항) 해당 구문은 SyntaxError와 유사하나, 정상적인 구문은 실행된다는 차이가 있음. 해당 구문은 list_a를 찾을 수 없어 발생한 예외로, list_a를 지정한다면 정상적으로 작동함.
(결론) SyntaxError와 Exception은 형태는 유사하나 실행과정에서 차이가 있음. SyntaxError는 문법이 완벽하지 않아 실행자체가 되지 않는 형태이고, Exception은 프로그램 실행 중 발생하는 형태로 예외가 발생하는 지점에서 발생함.
# 예외 처리(code 1)
user_input_a = input('정수 입력 >>')
if user_input_a.isdigit():
# 입력 정보 정수 변환
number_input_a = int(user_input_a)
# 정보 출력
print('원의 반지름>>', number_input_a)
print('원의 둘레>>', 2*3.14*number_input_a)
print('원의 넓이>>', 3.14*number_input_a**2)
else:
# 예외 처리
print('정수를 입력해주십시오.')
정수 입력 >>4
원의 반지름>> 4
원의 둘레>> 25.12
원의 넓이>> 50.24
# 예외 처리(try except) (code 2)
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('입력 정보를 다시 확인해주십시오')
정수 입력 >>chill
입력 정보를 다시 확인해주십시오
2) 예외 처리(pass, else)
# 예외 처리(try except & pass) (code 3)
list_input_a = ['52', '273', '32', 'chill guy', '103']
list_number = []
for item in list_input_a:
# float 변환 후 리스트 추가
try:
float(item)
list_number.append(item) # 예외가 아닌 경우 리스트에 추가
except:
pass # float 변환 중 예외 발생 시 작동
print(f"리스트 내부에 있는 자료는{list_input_a}입니다")
print()
print(f"리스트 내부에 있는 float는{list_number}입니다")
리스트 내부에 있는 자료는['52', '273', '32', 'chill guy', '103']입니다
리스트 내부에 있는 float는['52', '273', '32', '103']입니다
# 예외 처리(try except & else) (code 4)
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)
정수 입력>>>66
원의 반지름>> 66
원의 둘레>> 414.48
원의 넓이>> 13677.84
3) finally
# finally
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("정수를 입력해주십시오")
else:
print("예외가 발생하지 않았습니다.")
finally:
print("프로그램을 종료합니다. ")
정수 입력>>>22
원의 반지름>> 22
원의 둘레>> 138.16
원의 넓이>> 1519.76
예외가 발생하지 않았습니다.
프로그램을 종료합니다.
# finally 예시 1
def test():
print("test() 함수 실행") # 실행 1단계
try:
print("try 구문 실행 중") # 실행 2단계
return # 실행 3단계(try 구문 탈출)
print("try return 실행 완료")
except:
print("except 구문 실행")
else:
print("else 구문 실행")
finally:
print("finally 구문 실행 완료") # 실행 4단계
print("test() 함수 종료") # 실행 5단계(종료)
test()
test() 함수 실행
try 구문 실행 중
finally 구문 실행 완료
<예외 처리 가능 조합> 1) try + except 2) try + except + else 3) try + finally 4) try + else + finally 5) try + finally 이 외의 조합은 구문 오류 발생
output = 10 + '개'
int('안녕하세요')
cursor.close)
[1,2,3,4,5][10]
코드 | 오류 형태 | 사유 |
---|---|---|
output = 10 + '개' | SyntaxError | 자료형 불일치 |
int('안녕하세요') | Exception | 입력 자료 변환 불가능(int 호환X) |
cursor.close) | SyntaxError | 구문 정상 처리 불가능 |
[1,2,3,4,5][10] | Exception | 리스트 범위 외 처리 요구 |
def code_error(code):
try:
exex(code, {}, {}) # 코드 name space 할당
return("No Error", "오류 미발생")
except SyntaxError: # SyntaxError 발생 시 해당 코드 처리
return("SyntaxError", f"구문 오류(S): {SyntaxError}")
except Exception: # Exception 발생 시 해당 코드 처리
return("Exception", f"예외 발생(E): {Exception}")
# 분류 대상 code 설정
code = [
"output = 10 + '개'",
"int('안녕하세요')",
"cursor.close)",
"[1,2,3,4,5][10]"
]
# 저장된 정보 출력
for codes in code:
error_type, error_message = classify_error(codes)
print(f"Code: {codes}")
print(f"Classification: {error_type}")
print(f"Message: {error_message}\n")
Code: output = 10 + '개'
Classification: Exception
Message: 예외 발생: unsupported operand type(s) for +: 'int' and 'str'
Code: int('안녕하세요')
Classification: Exception
Message: 예외 발생: invalid literal for int() with base 10: '안녕하세요'
Code: cursor.close)
Classification: SyntaxError
Message: 구문 오류: unmatched ')' (<string>, line 1)
Code: [1,2,3,4,5][10]
Classification: Exception
Message: 예외 발생: list index out of range
코드 | 오류 형태 | 사유 |
---|---|---|
output = 10 + '개' | Exception | 서로 다른 자료형 처리 불가능 |
int('안녕하세요') | Exception | 입력 자료 변환 불가능(int 호환X) |
cursor.close) | SyntaxError | 구문 처리 불가능 |
[1,2,3,4,5][10] | Exception | 리스트 범위 외 처리 요구 |
code: https://colab.research.google.com/drive/11AH2PAKmIN1AeWLCddMX3ACWnxN8_B_k?usp=sharing