파이썬 노트 (3) 비정상 처리

5906 단어
예외
비정상적인 조건이 발생했을 때, 파이톤은 exception 대상을 사용하여 설명합니다.오류가 발생하면 프로그램이 이상을 던집니다. 이런 이상 정책을 처리하지 않으면 프로그램은traceback 방식으로 종료됩니다. 코드는 다음과 같습니다.
>>> 1/0  Traceback (most recent call last):  File "", line 1, in ?  ZeroDivisionError: integer division or modulo by zero
모든 이상은 하나의 종류의 실례이다. (상례는Zero Division Error) 많은 방법으로 이상을 던지고 포착하는데, 프로그램이 붕괴되지 않도록 처리하는 것이 가장 좋다.
이상을 던지다
>>> raise Exception  Traceback (most recent call last):  File "", line 1, in ?  Exception  >>> raise Exception('hyperdrive overload')  Traceback (most recent call last):  File "", line 1, in ?  Exception: hyperdrive overload
모든 Python의 자체 예외 유형을 나열합니다.
>>> import exceptions  >>> dir(exceptions)  ['ArithmeticError', 'AssertionError', 'AttributeError', ...]
이런 이상들은 모두 raise 문장으로 던질 수 있다
>>> raise ArithmeticError  Traceback (most recent call last):  File "", line 1, in ?  ArithmeticError
Class Name
Description
Exception
The base class for all exceptions 
AttributeError 
Raised when attribute reference or assignment fails 
IOError   
Raised when trying to open a nonexistent file (among other things) 
IndexError 
Raised when using a nonexistent index on a sequence 
KeyError
 Raised when using a nonexistent key on a mapping 
NameError    
Raised when a name (variable) is not found
SyntaxError 
Raised when the code is ill-formed 
TypeError  
Raised when a built-in operation or function is applied to an object of the  wrong type 
ValueError   
Raised when a built-in operation or function is applied to an object with  the correct type, but with an inappropriate value 
ZeroDivisionError 
Raised when the second argument of a division or modulo operation is zero
자신의 이상 클래스 정의
class SomeCustomException(Exception): pass

이상을 포착하다
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!"

함수에서 던진 이상은 호출된 곳 밖으로 전달할 수 있습니다. 함수가 이상을 포착하지 못하면 이 이상은 거품처럼 프로그램의 끝까지 전달됩니다.try/catch 문장은 다른 함수의 이상을 처리할 수 있음을 의미합니다.
만약 이상이 발생하여 처리할 수 없다면, raise 문장을 이용하여 그것을 계속 다른 곳에 던져서 포획할 수 있다.다음 코드:
class MuffledCalculator: 
    muffled = False 
    def calc(self, expr): 
        try: 
            return eval(expr) 
            except ZeroDivisionError: 
            if self.muffled: 
            print 'Division by zero is illegal' 
        else: 
            raise

모든 muffled 값이 True 및 false인 경우 코드는 다음과 같습니다.
class MuffledCalculator: 
    muffled = False 
    def calc(self, expr): 
        try: 
        return eval(expr) 
    except ZeroDivisionError: 
        if self.muffled: 
        print 'Division by zero is illegal' 
        else: 
            raise

여러 예외 캡처
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?"

만약 여러 개의 이상에 대해 같은 처리 방법을 가지고 있다면, 여러 개의 이상을 하나의 코드 블록에 통합할 수 있고, 이상은 모두tuple에 넣을 수 있다.
try: 
    x = input('Enter the first number: ') 
    y = input('Enter the second number: ') 
    print x/y 
except (ZeroDivisionError, TypeError, NameError): 
    print 'Your numbers were bogus...'

except 문장에서 이상 대상에 접근하려면 인자를 두 개로 바꾸면 됩니다. 아래와 같습니다.여러 개의 이상을 포획할 때 시스템에 영향을 주지 않고 로그 파일에 오류를 기록하려면 이 방법이 매우 유용하다.
try: 
    x = input('Enter the first number: ') 
    y = input('Enter the second number: ') 
    print x/y 
except (ZeroDivisionError, TypeError), e: 
    print e

주의,
파이썬 3.0에서 이렇게 써야 돼요.
except  (ZeroDivisionError, TypeError) as e.

만약 당신이 모든 잘못을 포착하고 싶다면, 당신은 이렇게 쓸 수 있습니다.
ry: 
    x = input('Enter the first number: ') 
    y = input('Enter the second number: ') 
    print x/y 
except: 
    print 'Something wrong happened...'

그러나 이렇게 하는 것은 위험이 매우 크다. 왜냐하면 모든 이상을 무시하기 때문이다. 예를 들어Control+C의 수동 끝,sys.exit(), 등등.따라서 다음과 같은 형식으로 작성해야 한다.
except Exception, e 

그리고 e에 대해 일부 검사를 진행한다.
어떤 경우, 아래 코드는 이상이 발생할 때까지 프로그램을 정확하게 실행할 수 있다
try: 
    print 'A simple task' 
except: 
    print 'What? Something went wrong?' 
else: 
    print 'Ah... It went as planned.'

아래의 코드는 이상이 없는 경우에만 프로그램이 종료되고 이상이 있으면 출력이 어떤 이상인지 나타낸다
while True: 
    try: 
        x = input('Enter the first number: ') 
        y = input('Enter the second number: ') 
        value = x/y 
        print 'x/y is', value 
    except Exception, e: 
        print 'Invalid input:', e 
        print 'Please try again' 
    else: 
        break

finally 문
finally 문장은 이상이 발생할 때만 실행되며, 반은 뒷일을 처리하는 데 사용됩니다 ^^
x = None 
try: 
     x = 1/0 
finally: 
    print 'Cleaning up...' 
    del x

finally 문장에 있는 것은 프로그램이 붕괴되기 전에 실행됩니다
너도 이 네 개의 물건을 같은 문장의 빠른 가운데 놓을 수 있다
try: 
    1/0 
except NameError: 
    print "Unknown variable" 
else: 
    print "That went well!" 
finally: 
    print "Cleaning up."

좋은 웹페이지 즐겨찾기