예외처리

어떤 언어든 코드를 짜다보면 에러가 발생한다.

컴파일 에러일때는 문법상의 문제이기때문에 컴파일러가 친절하게 알려주는 오류부분을 찾아 수정하면 되지만 런타임시 문제가 발생한다면...? 노답이 되버린다.

이렇게 예외가 발생한 상황에서는 파이썬 시스템이 예외 객체를 생성해서 던져버리고는 뻗어버린다.

그래서 우리는 미리 예외처리를 해놓고 프로그램이 중단되지 않고 끝까지 진행되도록 하자!

사실 파이썬에서 예외처리가 필수는 아니지만 프로그램의 안정성을 높이기 위해서 사용하는 것이 좋다.

try:
	예외발생 예측 #예를들면 res 3/0
except 예외명:
	예외처리작성
def main():
    print('프로그램 시작')
    try:
        res = 3/0
        print('test1')
        res = 'aaa' + 1
        print('test2')
        arr[3]=4
    except ZeroDivisionError:
        print('0으로 나눌 수 없음')
    except TypeError as e:   #파이썬 내장된 에러메세지를 출력
        print(e)
    except Exception as e:  # 모든 예외를 포함
        print(e)
    except:      #예측못한 에러도 있을 수 있으니 따로 뭘 지정하지 않음.
        print('모든 에러')
    else:
        print('예외가 발생하지 않음')  #else는 써도 되고 안써도 되고
    finally:
        print('예외가 발생하건 정상실행되건 종료전 항상 실행되는 블록')

    print('프로그램 종료')

main()

out)

 

 

사용자정의에 의한 예외처리

 

아니면 파이썬에 정의되지 않은 예외 클래스를 쓰고 싶을 때 직접 만들수 있다.

class 예외클래스명(Exception):
	def __init__(self, msg): #생성자, 객체 초기화 함수. 사용할 에러 메세지 할당
	self.msg=msg

 

파이썬이 인지하지 못하는 예외를 직접 발생키시고 싶을 때 사용할 수 있는 구문이 있는데

raise 예외객체 생성

raise는 파이썬에 있는 에러를 사용해도 된다.  raise TypeError('에러 메시지') 처럼.

 



class NumError(Exception):    #Exception을 상속받음
    def __init__(self, msg):   #생성자. 객체 초기화 함수
        self.msg = msg


def f1(num):    #5이하의 숫자만 가능. 5보다 큰 숫자를 받으면 심각한 발생
    if num>5:
        raise NumError('num은 5보다 작거나 같아야 함')   #raise 예외객체 : 예외 발생 구문

    print(num)

def f2(num):
    if not isinstance(num, int) :     #타입을 확인하는 함수.(참/거짓)
        raise TypeError('num은 int이어야 함')
    return num+10

def main():
    try:
        f1(10)
        f2('aaa')
    except NumError as e:
        print(e.msg)
    except TypeError as e:
        print(e)

main()

위의 코드를 해석해보면

함수에서 예외가 발생하면 먼저 그 함수 안에서 예외처리 코드를 찾고 있으면 그것을 실행,
없으면 이 함수를 호출한 위치에서 예외처리 구문을 또 찾고 있으면 그 예외처리 구문을 실행한다.

없으면...결국 파이썬은 다운되버린다!

'파이썬이 제일 쉽다면서요' 카테고리의 다른 글

python #연습문제  (0) 2021.06.09
python #객체지향프로그래밍  (0) 2021.06.09
python #연습문제. 주소록 만들기  (1) 2021.06.08
phthon #입출력  (0) 2021.06.08
python #재귀함수  (0) 2021.06.07

+ Recent posts