본문 바로가기

Programming languages/Python

11.Exception

728x90
반응형

우리는 프로그램을 만드는 과정에서 다양한 오류를 접한다.

존재하지 않는 변수를 호출, 0으로 나누기, 서로 연산이 불가능한 자료형 끼리의 연산 등등 다양하다.

이러한 오류가 발생되면 프로그램은 중단되고 오류 메시지를 보여준다.

이러한 것들을 방지하기위해서 즉 유연한 프로그래밍을 위해서 오류처리 기법을 정리해 볼 것이다.

 

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

위는 try except문을 사용해서 예외처리를 한 것이다. 만약 0으로 나누는 상황이 발생하면 e를 호출함으로써 Zerodivisionerror를 출력시킨다. 만약 위가 5/0이 아니라 5/2일 경우 정상적으로 2.5가 출력됨을 알 수 있다.

 

try:
    print("x/y")
    x = int(input("x를 입력하세요:"))
    y = int(input("y를 입력하세요: "))
    x/y
except (ZeroDivisionError, IndexError) as e:
    print(e)
else:
    print(x/y)

위처럼 try except 문에 else를 사용할 수 도 있다.

try안에서 실행되는 문장에 에러가 있다면 except가 실행되고 그렇지 않은 경우 else가 실행된다.

위의 경우 x에 12y에 3을 입력하면 4.0이라고 결과가 옳게 출력된다. 0으로 나눈 것이 아니기에 else문이 실행됐기 때문이다.

그러나 x에 12 y에 0을 입력하면 except가 실행된다. 따라서 division by zero라고 에러가 출력된다.

 

try:
    print("x/y")
    x = int(input("x를 입력하세요:"))
    y = int(input("y를 입력하세요: "))
    x/y
except (ZeroDivisionError, IndexError) as e:
    pass
else:
    print(x/y)

이렇게 작성하면 오류가 발생 시 오류 메시지를 출력하지 않고 그냥 pass 해버리게 만들 수 도 있다. 물론 이러한 경우는 오류 회피가 꼭 필요한 상황에 사용해야 한다.

 

class Car: #Car 클래스 구현
    def move(self):
        raise NotImplementedError #raise를 통한 에러 발생 구현

class Benz(Car): #Car클래스를 상속받은 Benz 클래스 생성
    pass

benz = Benz() #Benz클래스의 객체 생성
benz.move()

raise함수를 사용하면 특정조건에서 에러를 만들 수 있다. 위는 상속받은 객체에서 move()가 없을 때 오류를 출력하는 것이다.

 

class Car: #Car 클래스 구현
    def move(self):
        raise NotImplementedError #raise를 통한 에러 발생 구현

class Benz(Car): #Car클래스를 상속받은 Benz 클래스 생성
    def move(self):
        print("Forward")

benz = Benz() #Benz클래스의 객체 생성
benz.move()

이와 같이 자식 클래스에서 move()를 구현해 주면 오류 없이 정상적으로 실행된다.

class MyError(Exception):
    def __str__(self):
        return "허용되지 않는 별명입니다."

def say_nick(nick):
    if nick == '바보':
        raise MyError()
    print(nick)

say_nick("천재")
say_nick("바보")

위와 같이 특정 상황에서 에러를 출력하도록 Exception 클래스를 상속받아서 나만의 오류를 만드는 클래스를 만들 수 도 있다.

위의 경우 첫번째 천재는 정상적으로 출력이 되지만 내가 say_nick이라는 함수에서 nick의 값이 "바보"가 되면 MyError을 호출하게 했기 때문에 say_nick("바보")는 오류가 발생한다.

 

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)

try except를 이용해서 위와 같이 구현도 가능하다.

728x90
반응형

'Programming languages > Python' 카테고리의 다른 글

13. Library  (0) 2021.12.23
12. Built-in-function  (0) 2021.12.19
10. Module & Package  (0) 2021.12.19
9. Class  (0) 2021.12.14
Examples) Chapter4  (0) 2021.12.12