Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

예외란

예외는 프로그램 실행 중 프로그램의 작동을 방해할 때 발생하는 이벤트를 의미한다. 일반적으로 python 스크립트는 대처할 수 없는 문제를 만날 때, 예외(exception)을 발생한다.

예외 처리

작성한 코드가 왠지 문제를 일으킬 수 있을 것 같다면, try: 블록으로 코드를 감싸면 된다. try: 블록에 있는 코드의 실행 중에 문제가 생기면 execption: 블록의 코드를 이용해서 문제를 해결하거나 로그를 남기는 등의 작업을 할 수 있다.

문법

try, execption의 간단한 사용법이다.
try:
   You do your operations here;
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block. 
중요한 점을 정리했다.
  1. 하나의 try문은 여러 개의 예외를 발생할 수 있다. 프로그래머는 예외종류에 따라서 다양한 대응을 할 수 있는 코드를 만들 수 있다.
  2. 모든 예외에 대해서 공통으로 사용할 수 있는 예외문을 만들 수도 있다.
  3. 아무런 예외가 발생하지 않았다면, else 문을 호출하게 할 수 있다.

예제

import os
import sys

logfile='editlog'
try:
    handle = open(logfile, 'r')
except IOError:
    print "파일 열기 실패"

else:
    print "파일 열기 성공";
    handle.close()

try-finally 문

finally는 예외가 실행되든 실행되지 않았던지 반드시 실행하는 코드다.
#!/usr/bin/python

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      fh.close()
except IOError:
   print "Error: can\'t find file or read data"

예외의 매개변수

예외는 매개변수를 가질 수 있다. 예외변수를 사용하면, 문제가 발생했을 때 자세한 원인을 파악하는데 도움이 된다.
import os
import sys

def myopen(fname):
    try:
        handle = open(fname, 'r')
    except IOError, var:
        print "파일 열기 실패 : ",var

myopen('editlog1')
만약 예외가 발생하면 아래와 같이 상세한 메시지를 출력한다.
파일 열기 실패 :  [Errno 2] No such file or directory: 'editlog1'

예외 발생하기

raise를 이용해서 클래스나 함수에서 예외를 발생시킬 수도 있다.
def address(name,age):
    if age < 0:
        raise ValueError,"나이는 0 보다 커야합니다."
    if age > 255:
        raise ValueError,"나이는 255 보다 작아야합니다."

try:
    address('yundream', 1000)
except ValueError,val:
    print val

표준예외

사용자 정의 예외

표준예외 대신 사용자 정의를 만들어 사용할 수도 있다.
# -*- coding:utf-8 -*-
import os
import sys

class AgeError(ValueError):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)


def address(name,age):
    if age < 0:
        raise AgeError,"나이는 0 보다 커야합니다."
    if age > 255:
        raise AgeError,"나이는 255 보다 작아야합니다."

try:
    address('yundream', 1000)
except AgeError,e:
    print e.value