이 섹션에서는 Python의 예외 처리의 원리와 주요 형태를 주로 소개합니다.
1. 예외란 무엇인가요?
예외 개체는 Python에서 비정상적인 상황을 나타내는 데 사용됩니다. 프로그램 실행 중에 오류가 발생하면 예외가 발생합니다. 예외 객체가 처리되거나 포착되지 않으면 프로그램은 역추적하여 실행을 종료합니다.
2. 예외를 발생시킵니다
Exception 예외 클래스 또는 Exception의 하위 클래스가 뒤따릅니다. Exception의 괄호 안에 예외 정보를 추가할 수도 있습니다.
>>>raise Exception('message')
참고: Exception 클래스는 모든 예외 클래스의 기본입니다. 예외 클래스 클래스를 사용하면 다음과 같이 이 클래스를 기반으로 자체 정의된 예외 클래스를 만들 수도 있습니다.
class SomeCustomException(Exception): pass
3. 예외 잡기(try/Exception 문)
try/Exception 문은 try 문 블록에서 오류를 감지하는 데 사용됩니다. Except 문은 예외 정보를 캡처하고 처리할 수 있습니다.
try 문 블록에서 여러 예외가 발생할 수 있습니다.
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except ZeroDivisionError: print "The second number can't be zero!" except TypeError: print "That wasn't a number, was it?"
예외 문은 여러 예외를 캡처할 수 있습니다.
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except (ZeroDivisionError, TypeError, NameError): #注意except语句后面的小括号 print 'Your numbers were bogus...'
캡처된 예외 개체에 액세스하고 예외 정보를 인쇄합니다.
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except (ZeroDivisionError, TypeError), e: print e
예측할 수 없는 예외가 누락되는 것을 방지하기 위해 모든 예외를 포착합니다.
try: x = input('Enter the first number: ') y = input('Enter the second number: ') print x/y except : print 'Someting wrong happened...'
4. else 절. Except 절을 사용하는 것 외에도 else 절을 사용할 수도 있습니다. try 블록에서 예외가 발생하지 않으면 else 절이 실행됩니다.
while 1: try: x = input('Enter the first number: ') y = input('Enter the second number: ') value = x/y print 'x/y is', value except: print 'Invalid input. Please try again.' else: break
위 코드 블록이 실행된 후, 사용자가 x, y 값을 입력하면 적법한 경우 else 서브루틴이 실행되어 프로그램 실행이 종료됩니다.
5.마지막 절. try 절에서 예외가 발생하는지 여부에 관계없이 finally 절은 반드시 실행되며 else 절과 함께 사용할 수도 있습니다. finally 절은 프로그램이 끝날 때 파일이나 네트워크 소켓을 닫는 데 자주 사용됩니다.
try: 1/0 except: print 'Unknow variable' else: print 'That went well' finally: print 'Cleaning up'
6. 예외 및 함수
함수 내에서 예외가 발생하여 처리되지 않으면 다음으로 전달됩니다. 함수 호출 처리되지 않은 경우 예외는 기본 프로그램으로 전달되고 스택 추적 형태로 종료됩니다.
def faulty(): raise Exception('Someting is wrong!') def ignore_exception(): faulty() def handle_exception(): try: faulty() except Exception, e: print 'Exception handled!',e handle_exception() ignore_exception()
위 코드 블록에서, handler_Exception() 함수가 fally()를 호출한 후,aulty() 함수는 예외를 발생시키고 다음으로 전달됩니다. Handle_Exception(), 따라서 try/Exception 문에 의해 처리됩니다. ignare_Exception() 함수에는 Faulty()에 대한 예외 처리가 없으므로 예외 스택 추적이 발생합니다.
참고: 조건문 if/esle은 예외 처리와 동일한 기능을 수행할 수 있지만 조건문은 덜 자연스럽고 가독성이 떨어질 수 있습니다.