본문 바로가기

프로그래밍언어/Python

ch05. 파이썬 날개달기 (패키지, 예외처리)

반응형

3. 패키지

 

  ■ 패키지

    - 파이썬 패키지는 디렉토리와 파이썬 모듈로 이루어진 구조이다.

    - .(dot)을 이용해서 계층적으로 접근 관리가 가능하다.

 

  ■ __init__.py

    - 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.

    ※ python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

 

    - __all__ 변수

      • 패키지 import 시에 *를 사용해 import 할 모듈들을 정의하는 변수

      • __all__ 변수에 정의되어 있지 않은 모듈은 *를 통해서 해당 패키지를 import 해도 사용할 수 없다.

    ※ from a.b.c import * 에서 패키지의 마지막인 c가 모듈인 경우에는 __all__에 정의되어 있지 않아도 c 모듈을 사용할 수 있다.

 

  ■ relative 패키지

    - 패키지 import 시에 상대적 ₩주소를 통해서도 불러오기 가능하다.

# .. 부모 디렉토리, . 현재 디렉토리
from ..sound.echo import echo_test

def test_func():
	echo_test()

    ※ 파이썬 인터프리터에서 상대주소를 사용하는 경우 에러 발생한다.

 

 

4. 예외처리

 

  ■ 오류 발생 상황 예제

    - FileNotFoundError: 존재하지 않는 파일 오픈시 발생

    - ZeroDivisionError: 0으로 다른 숫자를 나누는 경우 발생

    - Index Error: 리스트 등의 범위를 벗어난 인덱스에 접근하는 경우 발생

 

  ■ 오류 예외 처리 기법

    - try, except 문

      • try 문 실행 중 오류 발생시 except문 실행

# try - except 기본구조
try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...

    - try, finally 문

      • finally: 예외상황 발생 여부에 상관없이 실행되는 구문이다. 보통 리소스 close()시에 사용한다.

 

    - 여러개의 예외 처리

      • 각각의 발생 오류에 따라 서로 다른 예외문을 실행한다.

      • else문 사용 가능

try:
    ...
except 발생 오류1:
   ... 
except 발생 오류2:
   ...
except (발생 오류3, 발생 오류4):
   ...
else:
   ...

 

  ■ 오류 회피하기

    - pass를 이용해서 오류 회피하도록 한다.

# 오류 발생에도 pass를 통해서 오류를 통과하도록 한다.
try:
    f = open("나없는파일", 'r')
except FileNotFoundError:
    pass

 

  ■ 오류 발생시키기

    - raise를 통해 오류를 강제로 발생시킨다.

 

  ■ 예외 만들기

    - python 내장 클래스 Exception을 이용해서 예외 생성이 가능하다.

    - 예외 메세지, __str__

      • __str__로 반환되어지는 메세지가 예외 메세지로 출력되게 된다.

# 에러 생성
class MyError(Exception):
	def __str__(self):
		return "허용되지 않는 별명입니다."
    
def say_nick(nick):
    if nick == '바보':
    	# 에러 발생
        raise MyError()
    print(nick)
    
try:
    say_nick("천사")	# 정상 수행
    say_nick("바보")	# MyError 에러 발생
except MyError as e:
    print("허용되지 않는 별명입니다.")
    print(e)
    
'''
[출력]
천사
허용되지 않는 별명입니다.
허용되지 않는 별명입니다.
'''

 

반응형