Latest web development tutorials

파이썬 예외 처리

파이썬은 작업에 나타납니다 예외 및 오류 파이썬 프로그램을 처리 할 수있는 매우 중요한 두 가지 기능을 제공합니다. 당신은 디버그 파이썬 프로그램에이 기능을 사용할 수 있습니다.

  • 예외 처리 : 파이썬 튜토리얼 사이트 별 설명입니다.
  • 파이썬 튜토리얼 사이트 특정 설명 : (단정)를 주장한다.

파이썬 표준 예외

예외 이름 기술
BaseException 모든 예외에 대한 기본 클래스
SystemExit없이 통역 요청이 종료
KeyboardInterrupt 사용자가 실행 인터럽트 (일반적으로 입력 ^ C)
예외 일반 오류 기본 클래스
대하여 StopIteration 더 자세한 값을 반복자하지
GeneratorExit 발전기 (발전기) 비정상 종료를 통지합니다
StandardError 예외에 대한 기본 표준 기본 클래스의 모든
ArithmeticError 모든 수치 오류 기본 클래스
FloatingPointError 부동 소수점 계산 오류
OverflowError 수치 조작은 최대 한도를 초과
ZeroDivisionError 뿐만 아니라 (또는 계수)는 0 (모든 데이터 유형)에서
AssertionError를 어설 션 실패
AttributeError 이 객체는 프로퍼티가 없습니다
그러면 EOFError 기본 제공되지-에서 입력 및 EOF 마커 도착
EnvironmentError 운영 시스템 오류 기본 클래스
오류 IOError 입력 / 출력 작업이 실패합니다
OSError 운영 체제 오류
WindowsError 시스템 호출에 실패했습니다
ImportError를 가져 오기 모듈 / 개체 실패
LookupError 잘못된 클래스 데이터베이스 쿼리
IndexError 이 시퀀스 인덱스없이 (색인)
KeyError를 이 키 매핑없이
MemoryError의 메모리 오버플로 오류 (파이썬 인터프리터는 치명적인 아닌 경우)
나가서 설명하자면 NameError 선언되지 않은 / 개체를 초기화 (안 속성)
UnboundLocalError 액세스 초기화되지 않은 지역 변수
ReferenceError가 약한 참조 개체 (약한 참조)의 가비지 컬렉션에 액세스하기 위해 노력 해왔다
RuntimeError에 일반 런타임 오류
NotImplementedError 이 방법은 구현되지 않았습니다
구문 에러 파이썬 구문 오류
IndentationError 들여 쓰기 오류
TabError 탭과 공간 믹스
SystemError 보통 통역 시스템 오류
형식 오류 잘못된 작업 유형
ValueError를 전달 된 잘못된 인수
UnicodeError 유니 코드 관련 오류
UnicodeDecodeError 오류의 유니 코드 디코딩
UnicodeEncodeError 유니 코드 오류
UnicodeTranslateError 유니 코드 변환 오류
경고 경고 기본 클래스
DeprecationWarning 사용되지 않는 기능에 대한 경고
FutureWarning 의미의 미래 구조에 대한 경고가 변경되었습니다
OverflowWarning 이전 경고에 대해 자동으로 긴 정수 (긴)의 승진
PendingDeprecationWarning 그것은 폐기물 특성에 대한 경고가 될 것입니다
RuntimeWarning 의심스러운 런타임 동작 (런타임 동작) 경고
SyntaxWarning 구문 경고 의심스러운
UserWarning 사용자 코드 생성 경고

무엇 비정상?

그 예외는 정상적인 프로그램 실행에 영향을주는 프로그램의 실행 동안 발생하는 이벤트이다.

정상적인 상황에서, 때 파이썬 프로그램이 제대로 예외가 발생 처리하지 않습니다.

예외는 오류를 나타내는 파이썬 객체입니다.

파이썬 스크립트는 우리가 그것을 처리 캡처해야 할 때 예외 그렇지 않으면 프로그램이 종료됩니다, 발생합니다.


예외 처리

당신은 문을 제외 / 시도를 사용하여 예외를 잡을 수 있습니다.

문이 문을 제외한 예외를 캐치하고 정보를 처리 할 수 ​​있도록, try 블록에 에러를 검출하는데 사용된다는 점을 제외 /보십시오.

당신이 원하지 않는 경우 프로그램의 마지막에, 단지 내부에 그것을 잡으려고 할 때 예외가 발생합니다.

구문 :

다음은 제외하고 ... 다른 구문 .... 간단한 시도입니다 :

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

시도 문이다 시작할 때 이상이 다시 여기에있을 수 있습니다 발생했을 때, 절을 시도해하는 것은 먼저 실행되도록하려고 작품, 파이썬은 현재 프로그램의 맥락에서 표시됩니다, 무슨 일이 다음 실행에 따라 달라집니다 여부 예외가있다.

  • 예외가 문 후, 파이썬 시도하고 절을 제외하고 첫 번째 일치를 수행하기 위해 다시 도약 할 때를 제외하고, 예외 처리가 완료되어 수행하려고 할 때 발생하는 경우, 제어 전체 try 문을 통해에 흐름 (예외가 처리되지 않는 시간과 새로운 트리거 예외).
  • 이상이 년 후 try 문하지만 절을 제외하고 일치 발생하면 예외는 시도의 상단에 제출, 또는 (프로그램을 종료하고 기본 오류 메시지를 출력 할 것이다) 프로그램의 상단에 될 것입니다.
  • 당신이 절은 실행되지 않습니다하려고 할 때 예외가 발생하면, 파이썬 다른 문 (다음 다른 경우) 문 다음에 실행됩니다, 다음 전체 try 문을 통해 제어의 흐름.

다음은 간단한 예이고, 그 파일의 콘텐츠의 내용이 기록 된 파일을 열고 예외가 발생하지 않다 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

위의 프로그램 출력 :

$ python test.py 
内容写入文件成功
$ cat testfile       # 查看写入的内容
这是一个测试文件,用于测试异常!!

다음은 간단한 예이고,이 파일이 파일의 내용에 기입 된 내용을 열리지 만 파일 쓰기 권한을 가지고 있지 않은 예외가 발생

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

명령은 다음과 같다 TESTFILE 테스트를 용이하게하기 위해 코드를 실행하기 전에, 먼저 파일에 대한 쓰기 액세스를 제거 할 수있다 :

chmod -w testfile

그런 다음 위의 코드를 실행합니다 :

$ python test.py 
Error: 没有找到文件或读取文件失败

예외의 모든 유형을 사용하지 않고 제외

다음 예제를 제외한 모든 예외 유형없이 사용할 수 있습니다 :

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

방식으로 위의 시도-제외하고 문 발생하는 모든 예외를 포착 할 수 있습니다. 그러나이 프로그램을 통해 우리는 고유의 예외 정보를 식별 할 수있는 좋은 방법이 아닙니다. 그것은 모든 예외를 캡처하기 때문이다.


예외 여러 유형의 사용을 제외하고 함께

또한 다음과 같은 여러 예외를 처리하기 위해 문을 제외하고는 동일한를 사용할 수 있습니다 :

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

시도 - finally 문

시도 - 마지막으로 문을 예외가 최종 코드를 수행 발생하는지.

try:
<语句>
finally:
<语句>    #退出try时总会执行
raise

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
finally:
    print "Error: 没有找到文件或读取文件失败"

당신이 쓰기 권한이없는 파일을 열 경우 다음과 같이 출력은 다음과 같습니다

$ python test.py 
Error: 没有找到文件或读取文件失败

다음과 같은 예를도 쓸 수있다 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    try:
        fh.write("这是一个测试文件,用于测试异常!!")
    finally:
        print "关闭文件"
        fh.close()
except IOError:
    print "Error: 没有找到文件或读取文件失败"

try 블록에서 예외가 발생하는 경우, 마지막으로 즉시 코드의 차단합니다.

마지막으로 모든 문은 실행 후, 예외가 블록 코드를 제외하고 다시 실행 트리거 차단합니다.

매개 변수의 내용을 제외하고는 다릅니다.


이상 매개 변수

예외가 이상 정보 출력 매개 변수로 매개 변수를 취할 수 있습니다.

당신은 다음 사항을 제외하고 매개 변수 문을 통해 예외를 잡을 수 있습니다 :

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

특이 변수는 일반적으로 수신 된 예외 문에 포함되어 있습니다. 튜플 변수가 하나 이상의 값들을 수신 할 수있다.

튜플은 일반적으로 오류 문자열, 잘못된 번호, 잘못된 위치가 포함되어 있습니다.

다음은 하나의 예외의 예는 다음과 같습니다

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 定义函数
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "参数没有包含数字\n", Argument

# 调用函数
temp_convert("xyz");

다음과 같이, 상기 절차의 결과이다 :

$ python test.py 
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

이상 트리거

우리는 자신이 예외를 트리거 마련하기 위해 문을 사용할 수 있습니다

다음과 같이 인상 구문은 다음과 같습니다

raise [Exception [, args [, traceback]]]

예외 문 예외의 종류 (예를 들면, 나가서 설명하자면 NameError) 파라미터 이상 파라미터 값이다. 이 매개 변수를 제공하지 않을 경우 예외 인수는 "없음"입니다, 선택 사항입니다.

추적 예외 객체가있는 경우 마지막 인수는 (거의 실제로 사용 안함) 선택 사항입니다.

예외는 문자열, 클래스 또는 객체가 될 수 있습니다. 커널 제공 파이썬의 예외는, 대부분이 클래스의 인스턴스를 파라미터로하는 클래스의 인스턴스이다.

예외의 아주 간단한 정의를 다음과 같이 :

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

참고 : "제외"예외를 잡을 수 있으려면 문은 같은 예외 클래스 객체 또는 캐릭터 라인을 던져하는 것이 유용 할 수 있어야합니다.

예를 들어, 우리는 다음과 같은 문장은 "제외"예외 이상 캡쳐 :

try:
    正常逻辑
except "Invalid level!":
    触发自定义异常    
else:
    其余代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 定义函数
def mye( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

try:
    mye(0)                // 触发异常
except "Invalid level!":
    print 1
else:
    print 2

위의 코드의 구현, 출력은 :

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    mye(0)
  File "test.py", line 7, in mye
    raise Exception("Invalid level!", level)
Exception: ('Invalid level!', 0)

사용자 정의 예외

새로운 예외 클래스를 생성함으로써, 프로그램은 자신의 예외의 이름을 수 있습니다. 일반적인 예외가 직접 또는 간접적으로, 예외 클래스에서 상속해야합니다.

RuntimeError에 인스턴스 인스턴스와 연관된 다음을 클래스를 만들고,베이스 클래스 RuntimeError에 예외가 발생하는 경우 부가 정보를 출력한다.

try 블록에서, 사용자는 사용자의 예외를 제외하고 블록 명령문을 수행 변수 E는 인스턴스를 Networkerror 클래스를 생성하는데 사용된다.

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

위의 범주를 정의한 후 다음과 같이 예외를 트리거 할 수 있습니다 :

try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args