>  기사  >  백엔드 개발  >  Python의 예외 정보(예외)

Python의 예외 정보(예외)

不言
不言원래의
2018-04-24 16:14:493542검색

이 문서의 내용은 Python의 예외에 관한 것입니다. 이제 이를 여러분과 공유합니다. 도움이 필요한 친구들은 이를 참조할 수 있습니다. 예외 메커니즘은 프로그램에서 오류가 발생한 후 프로그램의 처리 방법을 나타냅니다. 오류가 발생하면 프로그램의 실행 흐름이 바뀌고 프로그램의 제어권이 예외 처리로 넘어갑니다. 다음 글은 Python의 예외 관련 정보를 주로 요약한 것입니다. 도움이 필요한 친구들이 참고할 수 있습니다.

ForewordException 클래스는 일반적으로 사용되는 예외 클래스로 StandardError, StopIteration, GeneratorExit, Warning 및 기타 예외 클래스를 포함합니다. Python의 예외는 상속 구조를 사용하여 생성됩니다. 기본 클래스 예외는 예외 처리기에서 캡처될 수 있으며, Python의 try...out 문을 사용하여 다양한 하위 클래스 예외가 캡처될 수 있으며, 예외 절은 다음과 같이 정의됩니다. 절을 시도하십시오.

Python의 예외 처리

예외 처리 문 구조


try:
 <statements>  #运行try语句块,并试图捕获异常
except <name1>:
 <statements>  #如果name1异常发现,那么执行该语句块。
except (name2, name3):
 <statements>  #如果元组内的任意异常发生,那么捕获它
except <name4> as <variable>:
 <statements>  #如果name4异常发生,那么进入该语句块,并把异常实例命名为variable
except:
 <statements>  #发生了以上所有列出的异常之外的异常
else:
<statements>   #如果没有异常发生,那么执行该语句块
finally:
 <statement>   #无论是否有异常发生,均会执行该语句块。

Explanation

    else는 선택 사항이며 0 또는 여러 예외가 있지만 그렇지 않은 경우에는 제외가 하나 이상 있어야 합니다.

  • 예외를 어떻게 지정하든 예외는 항상 인스턴스 개체에 의해 식별되며 대부분의 경우 특정 순간에 활성화됩니다. 일단 프로그램 어딘가의 Except 절에 의해 예외가 포착되면, 다른 raise 문이나 오류에 의해 다시 발생하지 않는 한 해당 예외는 종료됩니다.
raise 문


raise 문은 예외를 수동으로 발생시키는 데 사용됩니다. 여러 가지 호출 형식이 있습니다.

    raise # 인스턴스는 raise 문 이전이나 raise 문에서 생성될 수 있습니다.
  • raise #Python은 암시적으로 클래스의 인스턴스를 생성합니다
  • 이름(값) 인상 #예외를 발생시킬 때 추가 정보 제공 value
  • raise #가장 최근에 생성된 예외를 다시 발생
  • E

  • 에서 예외 발생 예:


추가 정보로 ValueError 인상: raise ValueError('양수 값만 허용 가능')

ValueError: raise ValueError('we can only accept positive values')

当使用from的时候,第二个表达式指定了另一个异常类或实例,它会附加到引发异常的__cause__属性。如果引发的异常没有捕获,Python把异常也作为标准出错消息的一部分打印出来:

比如下面的代码:

try:
 1/0
except Exception as E:
 raise TypeError(&#39;bad input&#39;) from E

执行的结果如下:

Traceback (most recent call last):
 File "hh.py", line 2, in <module>
 1/0
ZeropisionError: pision by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
 File "hh.py", line 4, in <module>
 raise TypeError(&#39;bad input&#39;) from E
TypeError: bad input

assert语句

assert主要用来做断言,通常用在单元测试中较多,到时候再做介绍。

with...as语句

with语句支持更丰富的基于对象的协议,可以为代码块定义支持进入和离开动作。

with语句对应的环境管理协议要求如下:

  • 环境管理器必须有__enter____exit__方法。

       __enter__方法会在初始化的时候运行,如果存在ass子在, __enter__函数的返回值会赋值给as子句中的变量,否则,直接丢弃。

       代码块中嵌套的代码会执行。

       如果with代码块引发异常, __exit__(type,value,traceback)方法就会被调用(带有异常细节)。这些也是由 sys.exc_info返回的相同值.如果此方法返回值为假,则异常会重新引发。否则,异常会终止。正常 情况下异常是应该被重新引发,这样的话才能传递到with语句之外。

       如果with代码块没有引发异常, __exit__方法依然会被调用,其type、value以及traceback参数都会以None传递。

下面为一个简单的自定义的上下文管理类。

class Block:
 def __enter__(self):
  print(&#39;entering to the block&#39;)
  return self
 
 def prt(self, args):
  print(&#39;this is the block we do %s&#39; % args)

 def __exit__(self,exc_type, exc_value, exc_tb):
  if exc_type is None:
   print(&#39;exit normally without exception&#39;)
  else:
   print(&#39;found exception: %s, and detailed info is %s&#39; % (exc_type, exc_value))
  return False

with Block() as b:
 b.prt(&#39;actual work!&#39;)
 raise ValueError(&#39;wrong&#39;)

如果注销到上面的raise语句,那么会正常退出。

在没有注销掉该raise语句的情况下,运行结果如下:

entering to the block
this is the block we do actual work!
found exception: <class &#39;ValueError&#39;>, and detailed info is wrong
Traceback (most recent call last):
 File "hh.py", line 18, in <module>
 raise ValueError(&#39;wrong&#39;)
ValueError: wrong

异常处理器

如果发生异常,那么通过调用sys.exc_info()when from을 사용할 때 두 번째 표현식은 예외를 발생시킨 __cause__ 특성에 추가되는 또 다른 예외 클래스 또는 인스턴스를 지정합니다. 발생한 예외가 포착되지 않으면 Python은 표준 오류 메시지의 일부로 예외를 인쇄합니다:

예를 들어 다음 코드는

|Exception Name|Description|
|BaseException|Root class for all exceptions|
| SystemExit|Request termination of Python interpreter|
|KeyboardInterrupt|User interrupted execution (usually by pressing Ctrl+C)|
|Exception|Root class for regular exceptions|
| StopIteration|Iteration has no further values|
| GeneratorExit|Exception sent to generator to tell it to quit|
| SystemExit|Request termination of Python interpreter|
| StandardError|Base class for all standard built-in exceptions|
|  ArithmeticError|Base class for all numeric calculation errors|
|   FloatingPointError|Error in floating point calculation|
|   OverflowError|Calculation exceeded maximum limit for numerical type|
|   ZeropisionError|pision (or modulus) by zero error (all numeric types)|
|  AssertionError|Failure of assert statement|
|  AttributeError|No such object attribute|
|  EOFError|End-of-file marker reached without input from built-in|
|  EnvironmentError|Base class for operating system environment errors|
|   IOError|Failure of input/output operation|
|   OSError|Operating system error|
|    WindowsError|MS Windows system call failure|
|    ImportError|Failure to import module or object|
|    KeyboardInterrupt|User interrupted execution (usually by pressing Ctrl+C)|
|   LookupError|Base class for invalid data lookup errors|
|    IndexError|No such index in sequence|
|    KeyError|No such key in mapping|
|   MemoryError|Out-of-memory error (non-fatal to Python interpreter)|
|   NameError|Undeclared/uninitialized object(non-attribute)|
|    UnboundLocalError|Access of an uninitialized local variable|
|   ReferenceError|Weak reference tried to access a garbage collected object|
|   RuntimeError|Generic default error during execution|
|    NotImplementedError|Unimplemented method|
|   SyntaxError|Error in Python syntax|
|    IndentationError|Improper indentation|
|     TabErrorg|Improper mixture of TABs and spaces|
|   SystemError|Generic interpreter system error|
|   TypeError|Invalid operation for type|
|   ValueError|Invalid argument given|
|    UnicodeError|Unicode-related error|
|     UnicodeDecodeError|Unicode error during decoding|
|     UnicodeEncodeError|Unicode error during encoding|
|     UnicodeTranslate Error|Unicode error during translation|
|  Warning|Root class for all warnings|
|   DeprecationWarning|Warning about deprecated features|
|   FutureWarning|Warning about constructs that will change semantically in the future|
|   OverflowWarning|Old warning for auto-long upgrade|
|   PendingDeprecation Warning|Warning about features that will be deprecated in the future|
|   RuntimeWarning|Warning about dubious runtime behavior|
|   SyntaxWarning|Warning about dubious syntax|
|   UserWarning|Warning generated by user code|

실행 결과는 다음과 같습니다:


rrreee

assert 문

🎜assert는 주로 Assertion을 하는 데 사용되며, 주로 단위 테스트에 사용됩니다. 나중에 소개하겠습니다. 🎜🎜🎜with...as 문 🎜🎜🎜🎜with 문은 코드 블록에 대한 지원 시작 및 종료 동작을 정의할 수 있는 보다 풍부한 객체 기반 프로토콜을 지원합니다. 🎜🎜🎜with 문에 해당하는 환경 관리 프로토콜의 요구 사항은 다음과 같습니다. 🎜🎜🎜🎜환경 관리자에는 __enter____exit__ 메서드가 있어야 합니다. _ __ ENTER __ 메소드는 초기화 중에 실행됩니다. ASS 하위가 있는 경우 __ Enter __ 의 반환 값은 AS 절에 변수를 할당하고, 그렇지 않으면 삭제합니다. 곧장. 🎜🎜🎜 코드 블록에 중첩된 코드가 실행됩니다. 🎜🎜🎜 with 코드 블록에서 예외가 발생하면 __exit__(type,value,traceback) 메서드가 호출됩니다(예외 세부정보 포함). 이는 sys.exc_info가 반환하는 값과 동일합니다. 이 메서드가 false를 반환하면 예외가 다시 발생합니다. 그렇지 않으면 비정상적으로 종료됩니다. 일반적인 상황에서는 with 문 외부로 전달될 수 있도록 예외를 다시 발생시켜야 합니다. 🎜🎜🎜 with 코드 블록이 예외를 발생시키지 않으면 __exit__ 메서드는 계속 호출되며 해당 유형, 값 및 역추적 매개변수는 None으로 전달됩니다. 🎜🎜🎜다음은 간단한 사용자 정의 컨텍스트 관리 클래스입니다. 🎜🎜🎜rrreee🎜🎜🎜위의 raise 문에서 로그아웃하면 정상적으로 종료됩니다. 🎜🎜🎜raise 문을 로그아웃하지 않고 실행한 결과는 다음과 같습니다. 🎜🎜🎜rrreee🎜🎜🎜🎜Exception handler🎜🎜🎜🎜예외가 발생하면 sys.exc_info() 코드를 호출하여 > 함수는 3개의 요소를 포함하는 튜플을 반환할 수 있습니다. 첫 번째 요소는 예외를 발생시킨 클래스이고, 두 번째 요소는 실제로 발생한 인스턴스입니다. 세 번째 요소인 추적 개체는 예외가 원래 발생했을 때의 호출 스택을 나타냅니다. 모든 것이 정상이면 3 None이 반환됩니다. 🎜🎜🎜Python의 내장 모듈에 정의된 예외🎜🎜🎜🎜🎜rrreee🎜🎜🎜관련 권장 사항: 🎜🎜🎜🎜Python 예외 처리 방법에 대한 자세한 그림 및 텍스트 설명🎜🎜🎜🎜<p class="clearfix"><span class="jbTestPos"></span></p>

위 내용은 Python의 예외 정보(예외)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.