Python Exception and Debug
什么是异常
处理一些不可预料的情况,比如文件不存在,空间满了,通讯超时等等。
遇到这些问题了程序该如何执行?
这就是异常处理的价值和我们处理异常的目的。
Python常见的异常
- ZeroDivisionError
- NameError
- TypeError
Eg:
ZeroDivisionError
- 这么写,没有任何的语法错误,IDE不会报错
- 但是一运行起来就发现了错误
NameError
- 之前没有定义过b,但是这里用到了
TypeError
- 两个不同类型的数强制进行运算
Python 的异常处理语法
try:
程序执行语句块
except ExceptionName as alias:
异常处理语句块
except ExceptionName as alias:
异常处理语句块
except ExceptionName as alias:
异常处理语句块
...
else:
无异常时处理语句块
finally:
必须处理语句块
- Exception 类型有很多,可以层层分析,对应着处理。最后可以加上处理 Exception 的语句,因为 Exception是父类,能捕获所有的异常。
- Exception
例子
example 1 - 简单例子
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