일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- ajax
- h4ckingga.me
- H4CKINGGAME
- 파이썬 #utf-8 #0xff
- js
- Calculator
- ssti
- 웹해킹
- 파이썬 #예외처리 #try #except #raise #오류만들기 #모든오류들을리뷰(?)한다
- Today
- Total
{dpp}
파이썬 예외처리(try, except, raise) 본문
파이썬의 예외처리를 배워봅시다!
예외처리는 오류를 무시하게 만드는겁니다.
저두 처음에 배울때는 이런생각이 들었습니다.
"음..? 오류는 해결해야지, 무시하게 만드면 나중에 뭔 일 나지 않을 까?"
하지만 엄청나게 똑똑하구 "신" 과 같은 분이 저에게 파이썬으로 만든 카카오톡 봇을 선물해주셨습니다.
직접 리버싱 하시면서 만드셨더라구요 ㄷㄷ
그래서 그걸로 봇을 만들다감 이상한 오류를 발견했는데 뭔 세마포 재한시간..? 이래가지구...
보니까 잠깐 생겼다 사라지는 건데 그냥 그걸로 프로그램이 멈춘 거인 거 같아서
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다 라는 오류가 발생한다
여기서 예외처리를 잘해주면 실제 프로그램에서도 마니 쓰일것이당
예를 들면 채팅 프로그램 등에다가 보내는 내용에 욕이 포함되어있으면
직접 만든 오류를 발생시키고 예외처리로 경고를 주는 등 많이 사용될 수 있다.
'파이썬 > 파이썬오류' 카테고리의 다른 글
파이썬 decode 'utf-8' codec can't decode byte 0xff 에러 (1) | 2020.08.11 |
---|