본문 바로가기
언어/Python

[Python 기본 공부정리] 11. 예외 처리

by 민-Zero 2020. 1. 5.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

1. 예외 처리란?

프로그램을 작성하다 보면 다양한 에러를 만나게 된다. 에러가 발생하면 도중에 프로그램이 멈추는데 이런 경우를 대비해 중간에 프로그램이 끊기지 않도록 에러가 발생하면 처리하는 것을 예외 처리라고 한다.

 

예를 들어 다음과같이 1/0을 수행하게 되면 0으로 나눌 수 없다는 에러가 발생하며 1/0 밑의 print들은 수행하지 않고 프로그램이 종료된다. 

 

하지만 지금부터 정리할 예외 처리를 사용하게 되면 에러가 발생해도 프로그램이 종료되지 않고 에러만 처리할 수 있도록 도와주는 것이다.

 

예외 처리에서 예외란 프로그램에서 벌어지는 예외적인 상황을 말한다. 예를 들어

존재하지 않는 파일을 열려고 하면 파일을 찾을 수 없는 FileNotFoundError 

잘못된 인덱스를 사용하여 리스트에서 값을 얻어올 수 없는 경우 IndexError 등 다양한 예외 상황이 존재한다.

대표적으로 자주 보는 에러의 예시로는

①FileNotFoundError(파일이 없는 경우)
②ZeroDivisionError(숫자를 0으로 나누었을 때)
③IndexError(리스트에서 얻어 올 수 없는 값)
④SyntaxError(구문 오류)
⑤EOFError(파일의 끝일 경우: 읽을 내용이 없을 경우)

⑥KeyboardInterrupt(입력된 값이 없을 경우)

등이 있다. 파이썬은 이러한 에러가 발생하면 프로그램을 중단하고 에러 메시지를 보여준다. 따라서 이러한 경우를 처리하기 위해 예외 처리를 수행하는 것이다. 물론 이것뿐만 아니라 더 많은 에러가 존재한다.

 

2. 기본적인 예외 처리 방법

기본적인 예외 처리 방법은 다음과 같다.

문법)

try:
    기능 수행
except [발생에러[as 에러메시지 변수]]:      [ ] 안에는 필요시 입력한다. 
    기능 수행

 

try 스코프를 수행하다가 오류가 발생하게 되면 except 구문이 수행되고 오류가 발생하지 않으면 except 구문을 수행하지 않고 넘어가게 된다. 조건문을 만나면 조건식이 참일 경우에만 수행되고 아닐 경우 그냥 넘어가는 것과 비슷하다. [] 구문은 필요시 작성하므로 총 3가지의 경우로 작성할 수 있다.

 

try:

    기능 수행

except:

    기능 수행

 

이와 같이 사용하게 되면 오류 발생 시 어떤 오류가 발생하는지 관계없이 except 구문에 작성한 기능이 동작한다.

 

try:

    기능 수행

except 발생 에러:

    기능 수행

이와 같이 사용하면 except에서 정한 오류와 이름이 일치할 때만 except 구문을 수행한다. 또한 에러를 정하게 되면 1가지의 에러에 대해서만 처리할 수 있으므로 except 구문을 여러 개 추가하여 사용할 수 있다.

 

try:

    기능 수행

except 발생 에러 as 에러 메시지 변수:

    기능 수행

 

이와 같이 사용하면 except에서 정한 오류 메시지의 내용까지 알고 싶을 때 사용한다.

이처럼 해당 오류의 오류 메시지를 as 뒤의 변수에 담아준다.

 

3. try~except~else, try~except~finally

try~except에 else를 추가하게 되면 예외에 걸리지 않을 시 즉, except구문이 실행되지 않을 경우 else구문에 속한 기능이 실행된다.

물론 except에서 구문을 끝내고 새로운 구문으로 실행하여도 되지만 에러를 대비하고 정상일 경우 실행하고자 하는 경우까지 하나의 구문으로 처리하고자 할 때 사용한다.

 

try~except구문에 finally를 추가하게 되면 에러의 발생 여부에 관계없이 finally구문이 실행된다. else가 에러가 발생하지 않을 경우 실행되는 구문이었다면 finally는 에러가 발생해도 하지 않아도 무조건 실행되는 구문이다. 주로 에러 발생 여부와 관계없이 반드시 수행해야 하는, 예를 들어 파일을 열어 기능을 수행했으면 기능이 끝나면 파일을 무조건 닫아야 하므로 이와 같은 경우에 이용한다.

else 구문은 IndexError발생으로 인해 수행되지 않았지만 finally 구문은 에러가 발생했지만 해당 기능을 수행하는 것을 확인할 수 있다.

 

4. 에러 피하기, 에러 발생시키기

특정 에러가 발생하면 이를 무시하고 계속 진행시켜야 할 경우 pass명령어를 사용하면 된다.

FileNotFoundError발생시 pass를 사용하여 아무것도 진행하지 않고 무시하고 수행되도록 되었다.

 

오류를 피하는 것뿐만 아니라 프로그래밍을 하다 보면 종종 오류를 일부러 발생시켜야 할 경우도 생긴다. 예를 들면 아직 업데이트 예정으로 기능을 구현하지 않았지만 수행시키는 버튼은 미리 만들어 놓은 경우 해당 버튼을 클릭하면 에러가 발생해야 한다. 이때 파이썬은 raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다.

TestFunc라는 클래스가 아직 기능이 구현되지 않은 test라는 함수를 가지고 있다고 가정하자. 만약 이 기능을 수행하려고 하는 경우 raise 명령어를 통해 파이썬 내장 에러코드로 아직 구현이 덜 되었을 경우 발생시키는 에러인 NotImplementedError를 임의로 발생시키는 예제이다. 따라서 TestFunc를 상속받은 Customer가 test 기능을 실행하려고 하면 에러가 발생하게 된다.

 

5. 사용자 정의 에러

스스로 작성한 프로그램에서 내장 에러에는 존재하지 않지만 의도하지 않은 잘못된 기능이 수행되는 것을 막기 위해 사용자가 직접 에러를 정의하여 사용할 수 있다. 직접 에러를 만들려면 파이썬 내장 클래스인 Exception 클래스를 상속받아 정의해야 한다.

간단히 예를 들어 비밀번호를 입력받는데 최소 6자를 입력받고 싶다. 그러면 5자 이하로는 에러를 발생시키는 사용자 정의 에러를 생성해보자.

사용자 정의 에러로 testErr 클래스를 생성하자. Exception클래스를 상속받아 생성하고 에러이지만 클래스로 생성되므로 생성자, 멤버 변수, 함수 클래스가 가진 기능을 이용하여 에러를 정의할 수 있다. 클래스 변수로 최솟값을 설정하고 생성자를 통해 멤버 함수를 초기화 한다. 

try문에서 비밀번호를 입력받아 testErr에서 설정한 최소값 보다 작으면 raise 명령어를 이용하여 testErr 에러를 발생시키고 except구문을 사용하여 오류 메시지를 출력한다.

__str__ 메소드는 오류 메시지를 출력했을 때 오류 메시지를 보여주기 위한 함수이다. __str__ 메소드는 print(err)처럼 오류 메시지를 print문으로 출력할 경우에 호출되는 메소드이다.

 

이처럼 클래스를 이용하여 에러를 정의하고 raise를 통해 내장된 에러는 아니지만 프로그램 제작자가 원치 않는 행동을 수행할 경우 에러를 발생시켜 다른 행동을 유도할 수 있다.

댓글