# 异常
### 什么是异常
"""
异常是程序运行过程中发生的非正常情况, 是一个错误发生时的信号
异常如果没有被正确处理的话, 将导致程序被终止, 这对于用户体验是非常差的, 可能导致严重的后果
处理异常的目的就是提高程序的健壮性
### 异常的分类
python解释器在执行代码前会先检查语法, 语法检查通过才会开始执行代码
1.
语法检测异常
作为一个合格的程序员
是不应该出现这种低级错误
2.
运行时异常
已经通过语法检测, 开始执行代码, 执行过程中发生异常
称之为运行时异常
### 异常:
```python
TypeError: 'int'
object is not subscriptable
对象不能被切片
TypeError: 'list'
object is not callable
对象不能被调用
IndexError: list
index
out
of
range
索引超出范围
TypeError: 'builtin_function_or_method'
object is not iterable
对象不能被迭代
KeyError: 'xxx'
不存在这个key
FileNotFoundError: [Errno 2]
No
such
file or directory: 'xxxxx'
文件找不到
```
### 异常的组成:
```python
Traceback(most
recent
call
last):
File
"F:/python8期/课堂内容/day29/11.常见异常.py", line
22, in < module >
with open("xxxxx") as f:
FileNotFoundError: [Errno 2]
No
such
file or directory: 'xxxxx'
Traceback
是异常追踪信息
用于展示错误发生的具体位置
以及调用的过程
其中
包括了
错误发生的模块
文件路径
行号
函数名称
具体的代码
最后一行
前面是错误的类型
后面
错误的详细信息
在查找错误时
主要参考的就是详细信息
```
### 异常处理
异常发生后
如果不正确处理将导致程序终止, 我们必须应该尽量的避免这种情况发生
# 重点:
必须掌握的语法
语法:
try:
可能会出现异常的代码
放到try里面
except 具体异常类型 as e:
如果真的发生异常就执行except
# 如何正确处理异常
1.
当发生异常
不是立马加try
要先找出错误原因并解决它
2.
try 仅在 即使你知道为什么发生错误, 但是你却无法避免
例如
你明确告诉用户
需要一个正确文件路径
然而用户依然传入了错误的路径
如
socket
双方都要使用管道, 但是如果一方有由于某些原因强行关闭了, 即使你知道原因也无法避免出错
那就只能try
保证程序正常结束
总结一句话: 能不加try
就不加try
## 自定义异常类
当系统提供异常类不能准确描述错误原因时
就可以自定义异常类
继承自Exception即可
```python
class MyException(Exception):
pass
```
### 主动抛出异常:
什么时候需要主动抛出异常
当我们做功能的提供者, 给外界提供一个功能接口
但是使用者不按照相应的方式来使用, 或者参数类型不正确等原因, 导致功能无法正常执行时, 就应该主动抛出异常
主动抛出异常使用raise
关键字
后面可以跟任何Exception的子类
或是
对象
```python
raise MyException
raise MyException("错误具体原因!")
```
### 断言assert
断言
其实可以理解为断定的意思
即非常肯定某个条件是成立的
条件是否成立其实可以使用if来判断
其存在的目的就是
为了简化if
判断而生的
优先掌握的内容:
1.
元类中的三个方法的执行时机以及使用场景
2.
单例模式
3.
异常处理语法
4.
要注重提升解决bug能力
有什么用
如何处理
** 什么是元类 **
** 有什么用? **
** 1.
控制类的创建过程 **
** 2.
控制对象的实例化过程 **
** 如何控制 **
** 控制类的创建过程
使用__init **
** 控制对象的实例化过程
使用
__call
也需要调用type的__call
并返回其结果 **
** `__new
会先于__init执行
在__new中必须
调用type的__new
并返回结果
` **
"""