점프투파이썬 참고
프로그램을 만들다 보면 수없이 많은 오류를 만나게 된다. 물론 오류가 발생하는 이유는 프로그램이 잘못 동작하는 것을 막기 위한 패이썬의 배려이다. 하지만 때때로 이러한 오류를 무시하고 싶을 때도 있다. 이를 위해 파이썬은 try, except를 사용해 예외적으로 오류를 처리할 수 있게 해준다.
실제 프로그램에서 자주 발생하는 오류 중심
디렉터리 안에 없는 파일을 열려고 시도했을 때의 오류

0으로 다른 숫자를 나누는 경우

리스트에서 얻을 수 없는 값을 추출하는 경우

1. try, except 문
try블록 수행 중 오류가 발생하면 except 블록이 수행된다. 하지만 try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.

위의 except 구문을 보면 [ ] 기호를 사용하는데, 이 기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법이다. 즉, except 구문은 다음 3가지 방법으로 사용할 수 있다.
1) try, except만 쓰는 방법
: 오류 종류에 상관없이 오류가 발생하면 except블록을 수행한다.

2) 발생 오류만 포함한 except문
: 오류가 발생했을 때 except문에 미리 정해놓은 오류 이름과 일치할 때만 except 블록을 수행한다는 뜻이다.

3) 발생오류와 오류 메시지 변수까지 포함한 except문
: 두번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법이다.

try:
4/0
except ZeroDivisionError as e:
print(e)
2. try ..finally
try문에는 finally절을 사용할 수 있다. finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다. 보통 finally절은 사용한 리소스를 close해야 할 때에 많이 사용된다.
foo.txt 파일을 쓰기 모드로 연 후에 try문을 수행한 후 예외 발생 여부와 상관없이 finally절에서 f.close()로 열린 파일을 닫을 수 있다.

3. 여러개의 오류처리하기
여러 개의 오류를 처리할 수 있다.

try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")


try:
age=int(input('나이를 입력하세요:'))
except:
print('입력이 정확하지 않습니다.')
else:
if age <= 18:
print('미성년자는 출입금지입니다.')
else:
print('환영합니다.')
프로그래밍을 하다보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있다.
try문 안에서 FilNotFoundError가 발생할 경우에 pass를 사용해 오류를 그냥 회피하도록한다.

프로그래밍을 하다보면 종종 오류를 일부러 발생시켜야 할 경우도 생긴다.
파이썬은 raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다
NotImplementedError는 파이썬 내장 오류로, 꼭 작성해야 하는 부분이 구현되지 않았을 경우 일부러 오류를 일으키기 위해 사용한다.class Bird:
def fly(self):
raise NotImplementedError
상속받는 클래스에서 함수를 재구현하는 것을 메서드 오버라이딩이라고 한다.class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly()

class Eagle(Bird):
def fly(self):
print("very fast")
eagle = Eagle()
eagle.fly()
>>very fast
프로그램 수행 도중 특수한 경우에만 예외 처리를 하기 위해서 종종 예외를 만들어서 사용한다. 직접 예외를 만들어 보자. 예외는 다음과 같이 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.
class MyError(Exception):
pass
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
say_nick("천사")
say_nick("바보")
'천사'가 출력된 후 MyError가 발생된다.

예외 처리 기법을 사용해 MyError 발생을 예외 처리해 보자.
class MyError(Exception):
pass
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick("천사")
say_nick("바보")
except MyError :
print("허용되지 않는 별명입니다.")
>>천사
>>허용되지 않는 별명입니다.
class MyError(Exception):
pass
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick("천사")
say_nick("바보")
except MyError as e :
print("e")
>>천사
print(e)로 오류 메시지가 출력되지 않는 것을 확인할 수 있다. 오류 메시지를 출력했을 때 오류 메시지가 보이게 하려면 오류 클래스에 다음과 같은 __str__메서드를 구현해야한다. __str__메서드는 print(e)처럼 오류메시지를 print문으로 출력할 경우에 호출되는 메서드이다.class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick("천사")
say_nick("바보")
except MyError as e :
print("e")
>>천사
>>허용되지 않는 별명입니다.