Python 예외 처리
Python은 Python 프로그램 실행 시 발생하는 예외 및 오류를 처리하기 위해 매우 중요한 두 가지 기능을 제공합니다. 이 기능을 사용하여 Python 프로그램을 디버그할 수 있습니다.
예외 처리: 이 사이트의 Python 튜토리얼에서 자세히 소개합니다.
주장: 이 사이트의 Python 튜토리얼에서 자세히 소개합니다.
Python 표준 예외
예외 이름 | 설명 |
---|---|
BaseException | 모든 예외에 대한 기본 클래스 |
SystemExit | 통역사 종료 요청 |
KeyboardInterrupt | 사용자가 실행을 중단합니다(보통 ^C 입력) |
Exception | 일반 오류에 대한 기본 클래스 |
StopIteration | Iterator에 더 이상 값이 없습니다 |
GeneratorExit | Generator 종료를 알리기 위해 예외가 발생했습니다 |
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 | 아직 구현되지 않은 메소드 |
SyntaxError | Python 구문 오류 |
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