[혼공학습단 13기] 5주차 과제

양승빈·2025년 2월 16일
0

혼공학습단 13기

목록 보기
7/9

자격증 시험까지 16시간... 인생 예외처리는 왜 없나요..?


5주차 과제

  • 기본 과제: 구문 오류와 예외의 차이 설명하기 (p.379 1번)
  • 추가 숙제: p.381 3번 문제 풀고 인증하기

기본 과제

  1. 구문 오류(SyntaxError)
# 구문 오류(SyntaxError)
print("# 프로그램 실행 중")

print("# 구문 오류 유도) # 따옴표로 닫지 않음
  File "<ipython-input-1-44209ba4e93b>", line 4
    print("# 구문 오류 유도) # 따옴표로 닫지 않음
          ^
SyntaxError: unterminated string literal (detected at line 4)
  • (특이사항) 해당 구문은 따옴표로 문장을 마무리하지 않아 발생한 SyntaxError임. 해당 오류 발생 시 프로그램 자체가 실행되지 않음
  1. 예외(Exception)
# 예외(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은 프로그램 실행 중 발생하는 형태로 예외가 발생하는 지점에서 발생함.


  1. 예외 처리 사례(try, except, finally)
    1) 예외 처리 (기본 형태)
# 예외 처리(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
입력 정보를 다시 확인해주십시오
  • (특이사항) 두 코드는 예외 처리의 대표적인 방법임. code 1은 if-else를 통한 예외처리, code 2는 try-except를 통한 예외처리임.

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
  • (특이사항) 위 두 구문은 각각 pass와 else를 활용한 예외 처리 구문임. code 3는 except 내 pass를 사용하여 구문 자체가 멈추지 않도록 하며, 변환 값을 예외 값을 제외한 변환 값을 리스트에 전달하며, code 4는 예외 사항을 단순하게 정의하여 올바른 형태의 자료를 else로 처리하는 구문임.

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
예외가 발생하지 않았습니다.
프로그램을 종료합니다. 
  • (특이사항) fianally는 예외 처리 구문 가장 마지막에서 사용할 수 있는 구문으로, 예외 처리 발생 여부에 상관없이 무조건적으로 실행되는 코드임.
# 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 구문 실행 완료
  • (특이사항) 위 코드에서 확인되듯 return으로 try-except 구문을 탈출하여도, 무조건적으로 finally 내 구문이 실행됨. 반복문에서도 활용 가눙

  1. 주의사항
    예외처리는 다음 규칙을 준수하여야 함
    1) try 구문은 단독으로 사용 불가능하며, except 또는 finally 구문과 함께 사용하여야 함
    2) else 구문은 반드시 except 구문 뒤에 사용해야 함. 예외 처리 하기도 전에 else구문이 작동할 수 없음
    <예외 처리 가능 조합>
    1) try + except
    2) try + except + else
    3) try + finally
    4) try + else + finally
    5) try + finally 
    이 외의 조합은 구문 오류 발생 

추과과제

  1. 다음 코드의 구문 오류, 예외 발생 여부를 판단하고, 예상되는 오류명을 기술하시오
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

0개의 댓글

관련 채용 정보