나 개발자 진짜 되냐?

5일차 파이썬 프로그래밍의 날개_오류 및 예외처리편 본문

파이썬을 시작했어요!

5일차 파이썬 프로그래밍의 날개_오류 및 예외처리편

Snow Rabbit 2022. 12. 17. 19:28

이름만 들어도 벌써부터 걱정이 되는

예외처리..

한번 보겠슴메

예외처리

오류가 발생했을 때 오류를 처리하는 것

 

자주 보이는 오류는 이런 것들이 있다고 한다.

 

1. 없는 파일을 열려고 시도하는 경우 : FileNotFoundError                             f = open ("없는 파일" , ' r ')2. 0으로 다른 숫자를 나누려는 경우 : ZeroDivisionError                              4 / 03. 리스트에서 얻을 수 없는 값 : IndexError                               a = [ 1, 2, 4 ]  a [4]

 

유연한 프로그래밍을 위해서 오류처리방법을 알아보도록 하자

 

I. try, except문

 

try 가 수행되면서 오류가 발생하면 except가 수행된다.하지만 try에서 오류 발생이 안된다면 except에서도 수행이 안된다.

 

기본구조는

 

try :......except [ 발생 오류 [ as 오류 변수 ]] :...

 

이렇게 생겼다.

 

except에 사용한 저 대괄호는 생략할 수 있다는 뜻이 담겨있다고 한다. 

 

I  - 1 )  try, except만 쓰기

 

try :...except :...

 

이렇게 해주면 오류가 어떤 거든 생기기만 하면 except가 수행된다.

 

I - 2 )  발생 오류만 포함한 except 

 

try :

...

except 발생 오류 :

...

 

적어둔 오류와 동일한 오류일 경우에만 except가 수행된다.

 

I - 3 ) 발생 오류와 오류 변수까지 포함한 except 

 

try :...except 발생오류 as 오류변수 :...

 

이렇게 해주면 오류의 내용까지도 알 수 있다고 한다.

 

예를 들어보자!

 

try :     8 / 0except ZeroDivisionError as e :    print (e)

 

print 값은 뭐 오류정보가 나올 것이다.

 

여러 개의 오류 처리는 어떻게 할까?!

 

I - 4) 여러개 오류 처리

try : ...except 발생 오류 1 :...except 발생오류 2 :...

 

좋은 예시를 가져왔다. 함께 보자

 

try :    a = [ 1, 2 ]    print ( a [3])    8 / 0

except ZeroDivisionError : 

    print ( "0으로 나눌 수 없습니다." )

except IndexError :

    print( "인덱싱 할 수 없습니다." )

 

except를 한 문장으로 만든다면?!

 

except ( ZeroDivisionError, IndexError ) as e :

    print ( e )

 

II. try, finally

finally는 try가 실행되면서 예외 발생과 상관없이항상 수행되는 친구이다.

 

보통 finally은 사용한 리소스를 close 할 때 사용된다.

 

try :     f = open(' 있는 파일', 'w')    ...finally :               # 중간에 오류가 발생하더라도 이건 무조건 실행!!    f.close ()

 

 

III. try, else

else도 사용할 수 있다.

 

try :....except 발생 오류 as 오류 변수 :...else...

 

try 문에서 오류가 있다면 except를오류가 없다면 else 절을 사용한다. 

 

오류를 일부러.. 만들기

뭐 일부러 만들어 내는 경우도 있다고 한다.사용하는 명령어는 raise라고 한다. 

 

좋은 예시를 또 가져왔습니다 호호..

 

클래스 Bird , 자식 클래스 Owl로 상속하는 기능을 만들겠습니다. 

 

class Bird :    def fly (self) :        raise NotImplementedError

 

여기서 이 raise가 에러를 발생시키는 친구이다.

 

그다음 자식 클래스이다.

 

class Owl(Bird) :    pass

 

owl = Owl()owl.fly()

 

이렇게 실행하게 되면 상속은 받았지만fly에 대한 부모 클래스에서 오류를 만들어 냄으로

raise NotImplementedError

가 나오게 됩니다.

 

오류를 안 만들어 내려면 어떻게 해야 할까?!

 

어제 배웠던 '오버 라이딩'을 통해서자식  클래스인 Owl에서 따로 구현을 해줘야 한다.

 

class Owl()    def fly (self) :        print("OwO")  

 

로 바꾸게 된다면 오류 없이 OwO가 출력될 것이다.

 

raise를 쓴다고 모든 게 다 에러로 비정상 종료되는 건 아니다.아까 배운 try except 안에서 raise를 쓰게 되면

 

raise로 에러가 생기지만 에러가 생기면 실행되는 except에 의해서except안에 있는 식이 실행되는 모습을 볼 수 있다.

 

try :     n = int(input("1부터 8까지 숫자를 적어주세요 : ")

 

    if n < 1 or n >8 :        raise 에러요...

 

    print (f '적은 값이 {num1}가 맞소?' )

              # 문자열 안에 숫자를 넣고 싶을 땐 앞에 f 글 쓰고 ' ' 작은따옴표와 보여줄 변수를 중괄호{}에 넣어준다.

except :

    print("아무거나 적지 마소")

 

휴..여기까지 온 당신..대단합니다물론 당신은 저도 포함입니다.

 

 

특수한 경우 예외를 만들어주는 경우가 있습니다.

 

하면 만들어 봅시다!

 

class BigError(Exception) :

    pass

 

여기서 Exception 이 친구는 파이썬 내장 클래스입니다. 그냥 뭐 파이썬 안에 있는 클래스 하나 상속했다고 생각하겠습니다.

 

def your_nick(nick) :    if nick == "배부"        raise BigError ()    print ( nick )

 

히킿ㅎ킥 배부는 내가 우리 엄마한테 가끔 부르는 말인디..바보에서 따왔습니다.......이렇게 글자로 쓰니 또 귀엽네요 단어 자체가 배부배부..

 

함수 호출 후your_nick("바보")your_nick("배부")

 

결과를 확인해보면 아마 바보가 한번 적힌 후 배부에서 막혀서 에러가 발생합니다.

 

우리는 이런 상황에서 예외를 처리해야 하는 일이 생깁니다.어떻게 처리해야 할까요!?

 

바로 위에서 잠깐 봤지만 우리가 예외를 보면 해야 하는 except를 써야 합니다.

 

try :

    your_nick("바보")

    your_nick("배부")

except BigError:

    print ("나만 쓰는 별명이야!!!")

 

이렇게 하게 되면

바보 밑에

나만 쓰는 별명이야!!!라고 나오게 됩니다.

 

이런 내가 원하는 에러코드 말고 진짜

 raise 때문에 생긴 에러코드를 보고 싶다면

 

except BigError as error :

    print (error)

해주면 된다.

 

엇.. 안 나온다고요?

맞아요...

 

왜냐면 우리는 pass로 넘겼잖아요?

그리고..

클래스에서는 오류 메시지를 보이게 하는

코드가 따로 있다네요?

 

__str__입니다.

이 친구는 print ( error ) 이랑 같은 역할을 해줍니다.

그렇다면 우리는 처음에 클래스 생성할 때로 돌아가서

다시 수정해줘야 합니다.

 

기억이 안 난다면 위로 올라가면서

노란색 문구를 찾으세요!!

 

class BigError(Exception):

    def __str__(self):

        return "나만 쓰는 별명이야!!!!!"

 

이렇게 하면 비정상적으로 종료되면서 문구는 저렇게 뜨게 된답니다!

 

오류를 회피하는 방법이 있다?!

 

이런 방법이 있다니깐 참고해서 보도록 하자!pass를 통해 이런 오류가 발생하면 그냥 보내준다는 의미를 담고 있다.

 

wow오래 걸렸네요..이해하는 데는 100만 년 걸릴지도 몰라요....

 

읽느라 고생하셨습니다.

 

그럼 끗!