Python Exception and Debug
什么是异常
处理一些不可预料的情况,比如文件不存在,空间满了,通讯超时等等。
遇到这些问题了程序该如何执行?
这就是异常处理的价值和我们处理异常的目的。
Python常见的异常
ZeroDivisionError
NameError
TypeError
Eg:
ZeroDivisionError
- 这么写,没有任何的语法错误,IDE不会报错
```NameError
![image-20220618181230216](https://s2.loli.net/2022/06/18/Z1mzoOG9N7iL3aD.png)
- 之前没有定义过b,但是这里用到了
#### TypeError
![image-20220618181313133](https://s2.loli.net/2022/06/18/DK9Zi4vhFsSlWzN.png)
- 两个不同类型的数强制进行运算
## Python 的异常处理语法
```python
try:
程序执行语句块
except ExceptionName as alias:
异常处理语句块
except ExceptionName as alias:
异常处理语句块
except ExceptionName as alias:
异常处理语句块
...
else:
无异常时处理语句块
finally:
必须处理语句块
类型有很多,可以层层分析,对应着处理。最后可以加上处理 Exception 的语句,因为 Exception是父类,能捕获所有的异常。```{0}Exception ## 例子 ### example 1 - 简单例子 ```python try: print(10/0) except NameError as e: print(type(e)) print(e) except ZeroDivisionError as e: print(type(e)) print(e) print('-------------End of the process-------------')
结果
<class 'ZeroDivisionError'>
division by zero
-------------End of the process-------------
Process finished with exit code 0
- 10/0 , ZeroDivisionError 的异常被成功 catch
example 2 - 合并两个 except
- 从上面的例子可以看到,我们的程序对于两个不同异常的处理手段是一样的,那么可以合并
try:
print(10/0)
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
print('-------------End of the process-------------')
<class 'ZeroDivisionError'>
division by zero
-------------End of the process-------------
Process finished with exit code 0
- 依然成功执行了
example 3 - Exception
try:
print('2'+2)
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(type(e))
print(e)
print('-------------End of the process-------------')
<class 'TypeError'>
can only concatenate str (not "int") to str
-------------End of the process-------------
Process finished with exit code 0
- 我们可以在最后抓住Exception,这样不管任何类型的异常,无论考虑到的还是没考虑到的,都能抓住。
- 我们没有针对TypeError 进行捕获,但依然catch了。
example 4 - else
try:
a = 1+1
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(type(e))
print(e)
else:
print('else')
print('-------------End of the process-------------')
else
-------------End of the process-------------
Process finished with exit code 0
- 语句中没有任何错误,所以程序执行else语句
- 当任一一个错误被捕获,else语句都不会被执行
example 5 - finally
try:
print(10/0)
except (NameError, ZeroDivisionError) as e:
print(type(e))
print(e)
except Exception as e:
print(type(e))
print(e)
else:
print('else')
finally:
print('finally')
print('-------------End of the process-------------')
<class 'ZeroDivisionError'>
division by zero
finally
-------------End of the process-------------
Process finished with exit code 0
- finally 语句一定会执行
- 就算程序没错误,执行了else,也会执行finally
Python 内置异常类型