Python 예외 처리


Python은 Python 프로그램 실행 시 발생하는 예외 및 오류를 처리하기 위해 매우 중요한 두 가지 기능을 제공합니다. 이 기능을 사용하여 Python 프로그램을 디버그할 수 있습니다.

  • 예외 처리: 이 사이트의 Python 튜토리얼에서 자세히 소개합니다.

  • 주장: 이 사이트의 Python 튜토리얼에서 자세히 소개합니다.


Python 표준 예외

예외 이름설명


BaseException모든 예외에 대한 기본 클래스
SystemExit통역사 종료 요청
KeyboardInterrupt사용자가 실행을 중단합니다(보통 ^C 입력)
Exception 일반 오류에 대한 기본 클래스
StopIterationIterator에 더 이상 값이 없습니다
GeneratorExitGenerator 종료를 알리기 위해 예외가 발생했습니다
StandardError모든 내장 표준 예외에 대한 기본 클래스
ArithmeticError에 대한 기본 클래스 모든 수치 계산 오류
FloatingPointError부동 소수점 계산 오류
OverflowError수치 연산이 최대값을 초과했습니다. limit
ZeroDivisionError나눗셈(또는 모듈로) 0(모든 데이터 유형)
AssertionError 어설션 문 실패
AttributeError객체에 이 속성이 없습니다
EOFError빌드 없음- 입력에서 EOF 플래그 도달
EnvironmentError운영 체제 오류의 기본 클래스
IOError 입출력 작업 실패
OSError운영 체제 오류
WindowsError시스템 호출 실패
ImportError모듈/개체를 가져오지 못했습니다
LookupError잘못된 데이터 쿼리 기본 클래스
IndexError순서에서 색인을 찾을 수 없습니다
KeyError지도에서 찾을 수 없습니다. key
MemoryError메모리 오버플로 오류(Python 인터프리터에는 치명적이지 않음)
NameError 선언되지 않은/초기화된 객체(속성 없음)
UnboundLocalError초기화되지 않은 지역 변수 액세스
ReferenceError 약한 참조는 가비지 수집된 객체에 액세스하려고 시도합니다
RuntimeError일반 런타임 오류
NotImplementedError 아직 구현되지 않은 메소드
SyntaxErrorPython 구문 오류
IndentationError들여쓰기 오류
TabError탭과 공백 혼합
SystemError일반 통역사 시스템 오류
TypeError유형에 대한 잘못된 연산
ValueError잘못된 매개변수
UnicodeError유니코드 관련 오류
UnicodeDecodeError유니코드 디코딩 오류
UnicodeEncodeError 유니코드 인코딩 오류
UnicodeTranslateError유니코드 변환 오류
경고기본 클래스 경고
DeprecationWarning더 이상 사용되지 않는 기능에 대한 경고
FutureWarning구조의 의미에 대한 경고 앞으로 변경됩니다
OverflowWarning오래된 승격에 대한 자동 경고
PendingDeprecationWarning이 기능은 더 이상 사용되지 않을 것이라는 경고
RuntimeWarning의심스러운 런타임 동작에 대한 경고
SyntaxWarning의심스러운 구문에 대한 경고
사용자 경고사용자 코드에 의해 생성된 경고

예외란 무엇인가요?

예외란 프로그램 실행 중에 발생하여 프로그램의 정상적인 실행에 영향을 미치는 이벤트입니다.

일반적으로 Python이 프로그램을 정상적으로 처리할 수 없는 경우 예외가 발생합니다.

예외는 오류를 나타내는 Python 객체입니다.

Python 스크립트에서 예외가 발생하면 이를 포착하고 처리해야 합니다. 그렇지 않으면 프로그램이 실행을 종료합니다.


예외 처리

예외를 포착하려면 try/exc 문을 사용할 수 있습니다.

try/Exception 문은 try 문 블록에서 오류를 감지하는 데 사용되므로, Except 문이 예외 정보를 캡처하고 처리할 수 있습니다.

예외 발생 시 프로그램을 종료하고 싶지 않다면 한번 시도해 보세요.

구문:

다음은 간단한 try....제외...else의 구문입니다.

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

의 작동 원리 try 는 try 문이 시작되면 Python은 예외가 발생할 때 여기에 반환될 수 있도록 현재 프로그램의 컨텍스트를 표시합니다. try 절이 먼저 실행되고, 실행 중에 예외가 발생하는지 여부에 따라 다음에 무슨 일이 발생하는지가 달라집니다.

  • try 이후의 명령문이 실행될 때 예외가 발생하면 Python은 예외가 처리된 후 try로 돌아가서 첫 번째 제외 절을 실행합니다. 전체 try 문을 통과합니다(예외를 처리할 때 새 예외가 발생하지 않는 한).

  • try 후 문에서 예외가 발생했지만 일치하는 Except 절이 없으면 해당 예외는 상위 try 또는 프로그램의 최상위 수준에 제출됩니다(이것은 프로그램을 종료하고 기본 오류 메시지를 인쇄합니다.

  • try 절이 실행될 때 예외가 발생하지 않으면 Python은 else 문 다음에 문을 실행하고(else가 있는 경우) 제어 흐름은 전체 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()

코드를 실행하기 전에 테스트의 편의를 위해 먼저 테스트 파일 파일의 쓰기 권한을 제거할 수 있습니다. 명령은 다음과 같습니다.

chmod -w testfile

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

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

예외 유형 없이 Except 사용

다음 예와 같이 예외 유형 없이 Except를 사용할 수 있습니다.

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

위의 try-Exception 문은 모든 발생 예외를 캡처합니다. 하지만 이는 좋은 방법이 아니며, 이 프로그램을 통해서는 구체적인 비정상적인 정보를 식별할 수 없습니다. 모든 예외를 포착하기 때문입니다.


여러 예외 유형과 함께 Except 사용

아래 표시된 것처럼 동일한 Except 문을 사용하여 여러 예외 메시지를 처리할 수도 있습니다.

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

try-finally 문

try-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 블록에서 예외가 발생하면 finally 블록 코드가 즉시 실행됩니다.

finally 블록의 모든 문이 실행된 후 다시 예외가 발생하고 Except 블록 코드가 실행됩니다.

매개변수의 내용이 예외사항과 다릅니다.


예외 매개변수

예외에는 출력 예외 정보 매개변수로 사용할 수 있는 매개변수가 포함될 수 있습니다.

아래 표시된 것처럼 제외 문을 통해 예외 매개변수를 캡처할 수 있습니다.

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

변수에서 수신한 예외 값은 일반적으로 예외 문에 포함됩니다. 튜플 형태의 변수는 하나 이상의 값을 받을 수 있습니다.

튜플에는 일반적으로 잘못된 문자열, 잘못된 숫자, 잘못된 위치가 포함됩니다.

Instance

다음은 단일 예외의 예입니다.

#!/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 문을 사용하여 스스로 예외를 발생시킬 수 있습니다

raise의 구문 형식은 다음과 같습니다.

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

문의 예외는 예외 유형입니다. (예: NameError) 매개변수는 예외 매개변수 값입니다. 이 매개변수는 선택사항입니다. 제공되지 않은 경우 예외 매개변수는 "None"입니다.

마지막 매개변수는 선택사항이며(실제로는 거의 사용되지 않음) 존재하는 경우 추적 예외 개체입니다.

인스턴스

예외는 문자열, 클래스 또는 개체일 수 있습니다. Python 커널에서 제공되는 대부분의 예외는 클래스 인스턴스의 매개변수인 인스턴스화된 클래스입니다.

예외 정의는 다음과 같이 매우 간단합니다.

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

참고: 예외를 포착하려면 "제외" 문이 다음과 같은 클래스 개체를 발생시켜야 합니다. 동일한 예외 또는 문자열.

예를 들어, 위 예외를 포착하는 경우 "제외" 문은 다음과 같습니다.

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

Instance

#!/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)

사용자 정의 예외

프로그램은 새 예외 클래스를 생성하여 자체 예외 이름을 지정할 수 있습니다. 예외는 일반적으로 Exception 클래스에서 직접 또는 간접적으로 상속되어야 합니다.

다음은 RuntimeError와 관련된 예제입니다. 예제에는 예외가 발생했을 때 자세한 정보를 출력하는 데 사용되는 기본 클래스인 RuntimeError가 생성됩니다.

try 문 블록에서는 사용자 정의 예외 이후에 Except 블록 문이 실행됩니다. 변수 e는 Networkerror 클래스의 인스턴스를 만드는 데 사용됩니다.

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

위 클래스를 정의한 후 다음과 같이 예외를 트리거할 수 있습니다.

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