Information Security

예외 처리 본문

Python

예외 처리

leeeeye321 2017. 3. 30. 04:27

예외 처리

(Exception handling)

-프로그램을 작성하다 보면 작성자가 의도하지 않은 동작이나 예상치 못한 오류가 수없이 발생한다.

오류가 발생하면 사용자 프로그램의 실행이 중지되거나 데이터 처리에 문제가 발생하게 된다.

이런 문제를 예방하기 위해 try, except을 이용하여 오류가 발생했을 때 어떤 방법으로 처리할 것인지 설정할 수 있다.

 

오류가 자주 발생하는 상황들

ValueError

-이렇게 숫자를 입력해달라고 안내 메시지에 적어놓았지만 꼭 문자를 입력하는 사람이 있다.

이런 경우 당연히 에러가 발생한다.

 

ZeroDivisionError

-어떤 숫자를 0으로 나누려 하면 에러가 발생한다.

 

IndexError

-리스트 a는 인덱스 범위가 0~2까지로 정의되어 있어서 a[4]는 접근할 수 없다. 그래서 에러가 발생한다.

 

try, except문의 기본 구조

try:

처리할 내용

except:

에러 발생 시 처리할 내용

 

-try 블록 수행 중 오류가 발생하면 except 블록이 수행된다.

try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.

 

try, except 사용하기

1. try, except만 사용

 

-무한 루프를 사용하여 숫자를 입력해야만 루프를 빠져나올 수 있다.

 

2. 특정 except 처리

-특정 오류를 except 문에 미리 정해놓고 그 정해놓은 오류가 발생했을 때만 except 문을 수행한다. 

-여러 except 문을 처리할 수 있다.

try:

...

except 발생 오류:

...

 

 

3. 오류 메시지 변수 사용

try:

...

except 발생 오류 as 오류 메시지 변수:

...

 

 

-except 문에 여러 오류들을 추가할 수 있고, 오류메시지도 함께 출력할 수 있다.

 

finally

-예외가 발생하면 그 문장 뒤의 문장들은 수행되지 않는다. 그런데 예외가 발생하는 문장 뒤에 반드시 수행되어야 하는 문장들이 있을 수 있다. 그런 상황에 finally를 사용할 수 있다. finally에 포함된 구문은  try 문 수행 중에 예외가 발생하여도 무조건 수행된다.

 

클래스에서 예외 처리 활용하기

추상 클래스(Abstract class): 부모 클래스에서 메서드의 원형을 선언하고, 자식 클래스에서 구현하는 방법

추상 클래스는 상속받은 자식 클래스에서 반드시 구현해야 한다.

-이렇게 상속받은 클래스가 fly 함수를 구현하지 않으면 오리는 날지 못하는데 오리 자기 자신은 날 수 있다고 생각한다. 이런 경우를 대비하여 Bird 클래스를 상속받는 자식 클래스가 fly 함수를 구현하지 않으면 강제로 에러를 발생시켜서 반드시 fly 함수를 구현하도록 만들 수 있다.

  

-Duck 클래스와 Eagle 클래스는 Bird 클래스를 상속받았지만 fly 함수를 구현하지 않았기 때문에 Bird 클래스의 fly 함수가 호출된다. 그리고 fly 함수 안의 raise 문에 의해 NotImplementedError가 발생한다.

 

-에러가 발생하지 않도록 하려면 Duck 클래스와 Eagle 클래스에서 fly 함수를 반드시 구현해야 한다.

그렇게 해서 오리는 자기 자신이 날 수 없다는 것을 깨닫게 된다.

 

※ 상속받는 클래스에서 함수를 재구현하는 것을 메서드 오버라이딩(Overriding)이라고 한다.

※ NotImplementedError는 파이썬 내장 오류로, 작성해야만 하는 부분이 구현되지 않았을 경우 강제로 오류를 발생시키고자 사용한다.

 

'Python' 카테고리의 다른 글

외장 함수  (0) 2017.04.01
내장 함수  (0) 2017.03.31
File  (0) 2017.03.29
Module  (0) 2017.03.28
Class  (0) 2017.03.24