一、断言

断言,可以理解为判断是否断开的预言。



assert  表达式 , 描述



表达式为我们的预期结果,当表达式的结果为False时,抛出 AssertionError 异常,如无异常捕获程序遇到异常时直接结束运行。反之,表达式结果为True 程序继续向下运行。

我们何时使用断言?

断言需要慎用,尤其是写测试用例或者程序时,因为我们运行程序时,如果断言失败,无异常捕获程序则会结束运行,导致后面的代码无法执行。

断言一般用在防御型的编程、运行时检查程序逻辑、检查约定、程序常量、检查文档时,在从来不会运行失败的代码不必要加上断言。

示例1.1:当pi值对修改抛出异常



class



输出结果:



Traceback (most recent call last):
   assert self.pi == Circle.pi, 'pi 值被修改'
AssertionError: pi 值被修改



示例1.2:



assert



二、语法错误与异常的区别

语法错误:或者称之为解析错,程序无法解析或者编译

1、语法错误:代码不符合解释器或编译器的语法,如:print()输出单词出错

2、逻辑错误:不完成或者不合法的输入或者计算机出问题,如:死循环

异常:执行过程中出现问题导致程序无法执行

1、程序遇到逻辑或者算法问题,如:1/0

2、运行过程中计算机错误,如:内存不够或者IO错误

异常出现的过程:

1、异常产生,检查到错误且解释器认为是异常,抛出异常

2、异常处理,截获异常,忽略或者终止程序处理异常

总结:异常都可以是错误,但是错误不一定是异常

三、异常

运行期间检测到的错误被称为异常,大多数的异常都不会被程序处理,都以错误信息的形式展现。

如下:



>>>1/0
Traceback (most recent call last):
 File "<input>", line 1, in <module>
ZeroDivisionError: division by zero
>>>4+a*5
Traceback (most recent call last):
 File "<input>", line 1, in <module>
NameError: name 'a' is not defined
>>>'2'+2
Traceback (most recent call last):
 File "<input>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly



异常以不同的类型出现,这些类型都作为信息的一部分打印出来。如上面例子中的类型有ZeroDivisionError,NameError 和 TypeError异常。

错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。

Python中常见的异常




python断言的意思 python断言错误_python异常处理


常见异常

四、异常处理 try...except...else...finally...

怎么捕获异常,并处理?

我们捕获异常使用 try ... except ...,try 与 except 之间是可能会发生异常的语句块,而 except 下的语句块是当异常发生后我们进行处理的语句块。

示例 4.1:


while


运行程序:


接收一个除数:1
2.0
接收一个除数:0
发生了异常
接收一个除数:2a
发生了异常


如上,当我们输入0发生了异常,输入2a也发生了异常,因为int()无法将2a转换为int,而且两种异常类类型不同。

怎么捕获特定的异常?

在 except 后加入异常类型,就可以捕获特定的异常,也可以一次性捕获多个异常,如下示例4.2

示例4.2:


while


运行程序:


接收一个除数:0
发生了ZeroDivisionError异常
接收一个除数:a
发生了ValueError或KeyboardInterrupt或TypeError异常


except 后语句只在发生异常后才执行,那么有没有当异常没有发生时我们才进行处理的语句?

有,try ... except ... else ...,else 后的语句块是当异常没有发生后才会执行。

示例4.3:


while


运行程序:


接收一个除数:0
发生了ZeroDivisionError异常
接收一个除数:1
2.0
结束程序运行


如上运行结果,else只有在没有发生异常的时候运行。

异常发生可以处理,异常没发生也可以处理,那么有没有不管是否发生异常都进行处理的语句?

有try ... except ... finally ...,finally 下的语句块不管有没有发生异常都会执行。

示例4.4:


while


运行程序:


接收一个除数:1
2.0
执行了finally语句块
接收一个除数:0
发生了ZeroDivisionError异常
执行了finally语句块


如上 finally 下的语句块,不管有没有出现异常都会执行。

try ... except ... else ... finally ... 的使用顺序

try ... except ... else ... finally...使用顺序,else 必须在 except 后 finally 前,finally 只能在最后;else 与 finally 可有可无。

语法上 except 也可以缺少,不过少了except就不能捕获异常,没人会这样写代码。


try


五、抛出异常 raise

Python 可以使用 raise 语句抛出一个指定的异常


raise


raise 唯一的一个参数是指定要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

示例:


raise


输出结果:


Traceback (most recent call last):
   raise NameError('使用一个还未赋值对象的变量')
NameError: 使用一个还未赋值对象的变量


try ... except ... finally ... 使用场景

try ... except ... finally ... 是非常常用,主要用于如关闭数据库连接,文件关闭,释放线程锁等。


fo


附件:异常类列表

来自官方文档:5. Built-in Exceptions


BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
           +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning


2020年4月16日,第一次更新,优化内容