{dpp}

파이썬 예외처리(try, except, raise) 본문

파이썬/파이썬오류

파이썬 예외처리(try, except, raise)

dpp07 2020. 7. 4. 22:43

파이썬의 예외처리를 배워봅시다!

 

예외처리는 오류를 무시하게 만드는겁니다.

저두 처음에 배울때는 이런생각이 들었습니다.

"음..? 오류는 해결해야지, 무시하게 만드면 나중에 뭔 일 나지 않을 까?"

 

하지만 엄청나게 똑똑하구 "신" 과 같은 분이 저에게 파이썬으로 만든 카카오톡 봇을 선물해주셨습니다.

직접 리버싱 하시면서 만드셨더라구요 ㄷㄷ

그래서 그걸로 봇을 만들다감 이상한 오류를 발견했는데 뭔 세마포 재한시간..? 이래가지구...

보니까 잠깐 생겼다 사라지는 건데 그냥 그걸로 프로그램이 멈춘 거인 거 같아서

except OSerror:
	pass

라는 코드를 추가해 해결!

 

 

여기서 부터 1.기본적인 예외처리 방법 입니당 ㅎㅎ

 

 

여기서 눈치 채신 분도 있겠지만 (많겠지만)

예외처리를 하는 방법은

print(코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,하하핳,코드코드이거슨코드)

이거를 예시로 들을깨요

이걸 실행시키면

당연히

Traceback (most recent call last):
  File "h:\programes\Vsiual_code\test.py", line 1, in <module>
    print(코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,
하하핳,코드코드이거슨코드)
NameError: name '코드으' is not defined
계속하려면 아무 키나 누르십시오 . . .

라고 하시네요 ㅎㅎ

오류죠 ㄷㄷ

try:
    print(코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,하하핳,코드코드이거슨코드)
except:
    pass

이렇게 고치면 오류가 안 나옵니다~ 무시하게 만드는 거죠~

 

try는 시도하는겁니다!! try 영어단어 뜻 다들 아시죠?

그리고 except는 오류가 발생하면....이라는 겁니다.

pass는 그냥 넘기는 거죠

이러면 재대로 실행된건지 잘 모르니 except 대신에 print("success!")로 바꿔볼꺠요.

try:
    print(코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,하하핳,코드코드이거슨코드)
except:
    print("success!")

이려면 success! 가 출력될꺼에영 ㅎㅎ

 

여기서 try 안에 있는 print 양옆에 큰 따옴표("")를 넣어

오류를 없애봅시다.

try:
    print("코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,하하핳,코드코드이거슨코드")
except:
    print("success!")

이러면 오류가 없겠죠?

그러면 except문을 실행하지 않아요.

그럼으로 success!가 출력되지 않습니다.

대신,코드으,이거슨,아무런,의미오뵤는,코드으...

가 출력되죠 ㅎㅎ

여기까지 기본적인 예외처리 방법입니다!!

 

2. 특정 오류 예외처리

다를 거 없습니당 except뒤에 오류 이름만 추가하면 되요 ㅎㅎ

try:
    print(코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,하하핳,코드코드이거슨코드)
except NameError:
    print("success!")

하면 success!가 출력되죠

 

그러탐 NameError가 아닌 다른 오류를 만들어볼꺠용

try:
    print(0/0)
    print(코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,하하핳,코드코드이거슨코드)
    
except NameError:
    print("success!")

이렇게 print(0/0)를 앞에 추가해 ZeroDivisionError: division by zero 라는 오류를 만들었습니다.

이때 print(0/0)는 print(코드으,이거슨,아무런,~~~~ 보다 앞에 넣어줘야 합니다.

이유는 오류가 발생하면 코드가 멈추기 때문이죠.

 

그러므로 ZeroDivisionError 뒤에 NameError가 일어났지만 success!가 출력되지 않았습니다.

prnit(0/0)와 print(코드으,이거ㅗ스~~~ 의 위치를 바꾸면 success!만 출력되죠.

이것도 except로 간 후 코드의 try에서 벗어났기 때문입니다.

 

둘다 예외처리 시키려면 어케해야될까용?

except를 하나 더 만드면 됩니다

try:
    print(0/0)
    print(코드으,이거슨,아무런,의미어뵤는,코드으,오타가,낮지만,고치기귀찬으아요,하하핳,코드코드이거슨코드)

    
except NameError:
    print("success!")
    
except ZeroDivisionError:
    print("success!!")

이렇게요!!

하지만 이러면  ZeroDivisionError만 예외 처리되고 프로그램이 끝나겠죠..?

두 print의 위치를 바꾸면 NameError만 예외 처리되고 프로그램이 끝나구용

쨋든 여러 오류를 예외처리하는방법은 이거입니다 ㅎㅎ

 

3.오류 발생시키기

raise를 사용하여 오류를 만들어낼수있다.

raise NameError()

실행시키면 

Traceback (most recent call last):
  File "h:\programes\Vsiual_code\test.py", line 1, in <module>
    raise NameError()
NameError
계속하려면 아무 키나 누르십시오 . . .

라고 한네요.

먼가 그냥 "NameError"하니 이상해 보이지 않나요?

보통 NameError: name 'test0' is not defined 이렇게 오류가 나오는데

 

NameError: name 'test0' is not defined 이런 식으로 만드는 방법도 있습니다

raise NameError("name 'test0' is not defined")

이렇게 NameError 뒤에 괄호에 그 뒤에 붙을 말을 적어주는 것이다

 

그러면

Traceback (most recent call last):
  File "h:\programes\Vsiual_code\test.py", line 1, in <module>
    raise NameError("name 'test0' is not defined")
NameError: name 'test0' is not defined
계속하려면 아무 키나 누르십시오 . . .

라고 뒤에 붙어서 나옵니다

 

4.자신만의 오류 만들기

특정 경우애만 오류가 나오게 하려면 자신만의 오류를 만들면 됩니다!

class ErrorTest0(Exception):
    pass

이러면 오류가 만들어진 것이다

 

이것도 그냥 간단히

class ErrorTest0(Exception):
    pass
    
raise ErrorTest0()

로 오류를 발생시킬 수 있다

 

결과는

Traceback (most recent call last):
  File "h:\programes\Vsiual_code\test.py", line 4, in <module>
    raise ErrorTest0()
__main__.ErrorTest0
계속하려면 아무 키나 누르십시오 . . .

가 출력된다.

역시나 허전하다

 

그러면 이번에도

class ErrorTest0(Exception):
    pass
    
raise ErrorTest0("test")

라고 해주면 된다

__main__.ErrorTest0: test다 라는 오류가 발생한다

 

여기서 예외처리를 잘해주면 실제 프로그램에서도 마니 쓰일것이당

예를 들면 채팅 프로그램 등에다가 보내는 내용에 욕이 포함되어있으면

직접 만든 오류를 발생시키고 예외처리로 경고를 주는 등 많이 사용될 수 있다.

Comments