파이썬 노트 (3) 비정상 처리
비정상적인 조건이 발생했을 때, 파이톤은 exception 대상을 사용하여 설명합니다.오류가 발생하면 프로그램이 이상을 던집니다. 이런 이상 정책을 처리하지 않으면 프로그램은traceback 방식으로 종료됩니다. 코드는 다음과 같습니다.
>>> 1/0 Traceback (most recent call last): File "
모든 이상은 하나의 종류의 실례이다. (상례는Zero Division Error) 많은 방법으로 이상을 던지고 포착하는데, 프로그램이 붕괴되지 않도록 처리하는 것이 가장 좋다.
이상을 던지다
>>> raise Exception Traceback (most recent call last): File "
모든 Python의 자체 예외 유형을 나열합니다.
>>> import exceptions >>> dir(exceptions) ['ArithmeticError', 'AssertionError', 'AttributeError', ...]
이런 이상들은 모두 raise 문장으로 던질 수 있다
>>> raise ArithmeticError Traceback (most recent call last): File "
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."
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.