본문 바로가기
파이썬

[Python] 파이썬에서 예외를 다루는 방법

by 책 읽는 개발자_테드 2022. 4. 9.
반응형

파이썬 프로그래밍를 읽고, 정리한 글입니다.

목차

· 예외 처리하기

    - try~except

    - try~except~finally

    - raise 클래스

· 여러가지 에러


예외 처리하기


· 프로그램을 개발하다 보면 많은 에러가 발생한다. 파이썬은 예외 처리를 사용하여 이러한 에러를 개발자가 직접 처리할 수 있도록 한다.· 파이썬은 프로그램 처리 도중 에러가 발생하면, 해당 라인에서 프로그램이 정지된다.

- 인터프리터 방식을 사용하여 소스 코드를 기계어로 번역해 실행하는 프로그래밍 언어들의 특징이다.

· 경우에 따라 예외 처리를 사용하면, 처리 도중에 에러가 발생하여 정상적인 처리를 하지 못해도 프로그램을 강제 종료하지 않고 프로그램을 수행하도록 할 수 있다.

 

try~except 구문

· try~except 구문을 사용하면 예기치 못한 에러가 발생했을 때 적절하게 대응하면서 원만하게 프로그램을 실행할 수 있다. 

· 예외 처리 문법:

try:
    예러(예외)가 발생할 것 같은 수행문
    ...
except 발생 에러 관련 클래스명[as 에러메시지변수]:
    에러 대응 수행문

- try 구문 영역에서 실행되는 수행문에서 에러가 발생하지 않으면, except 구문의 수행문은 수행되지 않는다.

- try 구문 영역 내의 수행문이 실행되는 도중에 에러가 발생하면, except 구문이 자동으로 처리되며 준비한 에러 처리 실행문을 수행한다.

 

시스템이 제공하는 에러에 관한 메세지를 보고 싶지 않거나, 에러 증상에 대한 구체적인 처리를 하지 않을 경우 except 문 다음의 '발생 에러 관련 클래스명[as 에러메시지 변수]'를 생략할 수 있다.

try:
    예러(예외)가 발생할 것 같은 수행문
    ...
except 발생 에러 관련 클래스명[as 에러메시지변수]:
    에러 대응 수행문

 

· 예시

try:
    num = 0
    5 / num
except ZeroDivisionError as err:
    print('에러:',err)

결과

 

try~except~finally 구문

· try-except 다음에 finally 구문을 추가하면, 에러와 상관없이 실행되는 수행문을 더할 수 있다.

try:
    에러나 예외 상황이 발생할 것 같은 수행문
    즉, 일반 비즈니스 로직
except [발생 에러 [as 에러메시지변수]]:
    에러 발생 시 처리할 수행문
finally:
    에러와 상관없이 반드시 처리할 수행문

 

try~except~final 실행 로직

· 예시

def divideFunc(a, b):
    return a / b

quotient = divideFunc(5, 2) # 에러 없이 정상 처리
# quotient = divideFunc(5, 0)   # 에러로 인해 프로그램 강제 종료
print(quotient)

# 예외 처리 구문 시작
try:
    quotient = divideFunc(5, 2) # except를 만나지 않고 정상 진행
    # quotient = divideFunc(5, 0)   # 에러가 발생해 except 구문으로 실행 이도
    print(quotient)

    list = [1, 2]
    print(list[0])  # 정상적으로 인덱싱 진행
    # print(list[3]) 에러가 발생해 except 구문으로 실행 이동

    file = open('c:/work/abc.txt')  # abc.txt 파일이 없으면 에러 발생
except ZeroDivisionError:
    print("0으로 나눌 수 없다.")
except IndexError as e:
    print("참조 범위 오류:", e)
except Exception as e:
    print("에러 발생:", e)
finally:
    print("에러 유무에 상관없이 수행")

print("정상 종료")

결과

- 다양한 에러 처리를 모두 일관 처리하고 싶을 떄는 try~except Exception을 적어 주면 된다. Exception 클래스는 다른 예외 클래스의 부모클래스다.

- file = open('c:/work/abc.txt')에 대한 에러 처리 클래스는 FileNotFoundError를 사용할 수 있다.

 

raise 에러 클래스

· raise 에러 클래스를 사용하면 예외 처리를 별도 영역에서 처리할 수 있다.

def hasData(str):
    datas = ['kbs', 'mbc']
    if str not in datas:
        raise ValueError    # 데이터 값이 없으면 에러를 발생
    print('올바른 값')

try:
    hasData('kbs')
    hasData('mbc')
    hasData('sbs')
except ValueError:  # raise에 의해 발생된 에러가 처리
    print('잘못된 값')

결과

- hasData 함수는 try~except가 없는 상태에서 raise로 예외를 발생시킨다. 이렇게 되면 함수 바깥에 있는 except에서 예외가 처리된다. 예외가 발생해도 현재 코드 블록에서 처리해 줄 except가 없으면, except가 나올 때까지 계속 상위 코드로 올라가 예외를 처리한다.

 

여러가지 에러


에러의 종류

종류 설명
문법(syntex)에러 - 문법에 맞지 않는 소스 코드에서 나오는 에러로 쉽게 에러를 처리할 수 있다.
논리(logic)에러 - 프로그램 실행 중에 발생하며, 프로그램이 비정상으로 종료되는 오류다.
- 실행(runtime)오류로 분류되며, 보통은 프로그램 실행 중 결괏값의 이상이나, 원하는 값이 나오지 않는 에러다.
- 잘못됫 코딩으로 발생하는 오류이므로 에러를 잡아내기 쉽지 않지만, try-except 구문을 사용하면 효과적으로 처리할 수 있다.
예외(exception) - 예외란 코드를 실행하는 중에 발생한 에러를 뜻한다.
- 문법이나 논리상의 오류는 아니나 정상적인 실행을 방해하는 오류다.
ex) 키보드, 파일 입출력, 네트워크, 데이터베이스 처리 작업 등 외부 장치와 연결해 수행하는 경우 주로 발생 
- 예: try-except 구문

 

다양한 내장 예외 (Built-in Exceptions)

· 파이썬은 다양한 오류를 설명하는 여러 가지 내장 예외가 존재한다.

· 모든 예외는 BaseException 클래스를 상속한다.

- 모든 비시스템 종료 예외는 Exception 클래스를 상속한다.

 

TypeError

· 함수 호출 규약이 틀리거나,

연산자의 자료형이 틀리면 발생한다.

 

ValueError

· 작업에서 사용한 자료형은 맞는데 값이 틀리면 값 오류가 발생한다.

- int()는 str 자료형을 받아들일 수 있지만, "string"은 숫자로 변환할 수 없어 ValueError가 발생한다.

 

AttributeError

· 없는 속성을 가져오려 하면 발생한다.

 

NameError

· 없는 변수를 사용하면 발생한다.

 

KeyError, IndexError

· 컨테이너에 참조가 없을 때 발생하는 오류다.

 

JSONDecodeError

· json 객체를 만들기 위해 입력한 데이터 형식의 문제가 있으면 발생한다.

 

- json.loads()는 문자열을 받아 json 객체를 반환한다.

<-> json.dumps()는 json 객체를 받아 문자열을 반환한다.

 

 

반응형

댓글