一、断言
断言,可以理解为判断是否断开的预言。
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中常见的异常
常见异常
四、异常处理 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日,第一次更新,优化内容