수업정리/파이썬프로그래밍 및 실습

week7_2예외 처리와 파일

스카이버드 2023. 11. 11. 15:27

목차

 

1. 오류 종류와 특징

  • 구문오류(Syntax Error = 문법 오류, pasing error = 파싱 오류)
    ex) 따옴표, 콜론, 괄호를 빼먹는 등, 문법적 실수
  • 예외 오류(exception) : 문법적으로는 맞으나 전혀 예상치 못한 입력 값이나 비상적인 상황으로 발생
    ex) 나눗 셈을 하기 위한 input값에 숫자가 아닌 한글 '이백', '사백'을 대입..

2. 오류 대처방법 2가지

  • 사전탐지
  • 적절하게 다루기,예외 처리(handling)

2.1  try-except 문

문법 형식
try :
    {예외 발생 가능성 있는 코드}
except :
    {예외 발생시 실행할 코드}

ex)

그림 1. 오류가 발생시

 

그림2. 정상입력시

 2.1.1  에러의 종류 아는 법

try :

    {코드}

except Exception as e:

    print(e)

 >> 에러를 e로서 나타냄

 2.1.2 에러가 발생했을 때 구체적으로 예외 명시

try :

    {코드}
except ZeroDivisionError :

    print('0으로 나누는 오류')

except TypeError :

    print ('지원되지 않은 연산자를 사용하는 오류') 

 

 >> ZeroDivisionError, TypeError 등 각 에러에 맞춰 에러문구 출력, IF 설정하지 않은 에러가 발생한다면?

그림3. 설정하지 않은 에러 발생시

때문에 오류를 알려주는  except Exception as e : 를 써서 무슨 오류를 알려 주도록 해두자. 아래처럼

그림4. Excepion as e : 추가시

2.2. try-except-else 문

 try해보고 예외가 없으면 else문 실행 >> 그냥 try-except문이랑 큰 차이가 없는 거 같음..

try-except과 차이라고 한다면 try-except은 오류발생하든말든 프린트까지 일단 실행하고

try-except-else문은 에러가 없으면 else문을 실행하는정도 차이?

즉 에러발생시 print를 실행 하는 것과 안하는 것

ex)

try : 

    a, b = input(' 두 수를 입력하시오 : ').split()
    result = int(a) / int(b)

except ZeroDivisionError :

    print('0으로 나누는 오류')

except TypeError :

    print ('지원되지 않은 연산자를 사용하는 오류') 

except :

    print('오류 : 10 2와 같이 두 정수를 입력하세요.')

else :

    print('{}/{} ={}'.format(a, b, result))

 

2.3. try-except-finally 문

finally문예외의 발생 여부와 상관없이 항상 실행되는 블록

ex)

try :

    result = x / y

except ZeroDivisionError:

    ptint('0으로 나누는 오류발생')

else :

    print(''결과 :', result)

finally:

    print('수행완료')

 

2.4 raise 문 

 raise문은 사용자가 원하는 순간(상황)에 필요한 예외를 강제로 발생시킬 수 있는 기능

ex)

그림. raise 오류와 일반오류 비교

def get_ans(ans):
    if ans in ['예', '아니오']:
        print('정상적인 입력입니다.')
    else:
        raise ValueError('입력을 확인하세요')
while True:
    try:
        ans = input('예/아니오 중 하나를 입력하세요')
        get_ans(ans)
        break
    except Exception as e:
        print('error :',e)

 '예' or '아니오' 이외 값이 들어오면 에러 중 ValueError를 발생시키고 ValueError의 인수 값이 출력됨

 ※VlaueError 자리에는 어떤 종류의 에러를 적어도 된다. 내가 발생시키고 싶은 에러를 기재하면되는 것

따라서  출력되는 문구는 다음과 같다

3. 파일 입출력

  • 열기 : open()
  • 읽기 : read(), readline() >> 한줄 씩 읽기
  • 쓰기 : write()
  • 닫기 : close()
  • 파일연기 간단하게 : with

ex) 열기,읽기, 닫기

f = open('hello.txt','w')
f.write('hello')
f.close()
f = open('hello.txt','r')
s = f.read()
print(s)
f.cclose()

열기읽기저장할 장소가 필요하기에 변수지정이 필요함

만약 h = open('hello.txt','w')로 불러 왔으면 h.write('hello')로 써야함

 

 with 문

with open('hello.txt','r') as h:  # h = open('hello.txt','r')랑 비슷한 느낌
    s = h.read()
    print(s)