Python基础第15讲 - 异常
一、异常的简介
程序在运行过程中不可避免会出现一些错误
比如:使用了没有赋值过的变量、除0、使用不存在的索引…
这个错误在程序中我们就称之为异常
程序在运行过程中,一旦出现异常会导致程序会立即终止,异常后面的代码都不会执行
print ( 20 / 0 )
1.1 处理异常
程序出现异常,目的并不是程序立即终止
Python是希望在出现异常时,我们可以编写代码对异常进行处理
语法:
try:
代码块(可能出现错误的语句)
except 异常类型 as 异常名:
代码块(出现错误后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误后的处理方式)
except 异常类型 as 异常名:
代码块(出现错误后的处理方式)
else:
代码块(没有错误时要执行的语句)
finally:
代码块(是否有异常都会执行)
print ( 'python' )
try :
print ( 20 / 0 )
except :
print ( '出错了...' )
else :
print ( '程序没有错误,正常执行....' )
print ( 'hello' )
结果:
python
出错了. . .
hello
二、异常的传播
2.1 当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再传播
2.2 如果函数中没有对异常进行处理,则异常会继续像函数调用处传播
2.3 如果函数调用处处理了异常,则不再传播,如果没有处理则继续向调用处传播
2.4 直到传递到全局作用域,如果依然没有处理,则程序终止,并且显示异常信息
def fn ( ) :
print ( 'hello....' )
print ( 20 / 0 )
try :
fn( )
except :
pass
2.5 当程序运行过程中出现异常以后,所有的异常信息会被专门保存到一个异常对象当中
2.6 而异常传播时,实际上就是异常对象抛给了调用处
2.7 NameError类专门处理变量的错误
def fn ( ) :
print ( 'hello fn' )
print ( 20 / 0 )
def fn2 ( ) :
print ( 'hello fn2' )
fn( )
def fn3 ( ) :
print ( 'hello fn3' )
fn2( )
fn3( )
三、异常对象
如果except不跟任何内容,则会捕获所有异常,
如果except跟着一个异常类型,那么此时它只会捕获该类型的异常
Exception 是所有异常类的父类 所以如果except后跟的是Exception 它会捕获到所有的异常
finally语句无论是否出现异常 都会执行
print ( '异常出现前...' )
lst = [ ]
try :
print ( 20 / 0 )
except NameError:
print ( '出现 NameError 异常' )
except ZeroDivisionError:
print ( '出现 ZeroDivisionError 异常' )
except Exception as e:
print ( '出现异常了' , e, type ( e) )
finally :
print ( '无论是否出现异常 都会执行' )
print ( '异常出现后' )
四、自定义异常对象
抛出异常:可以是用raise语句来抛出异常,raise语句后面需要跟一个异常类或者是异常的实例
抛出异常的目的,告诉调用者这里调用时可能出现问题,希望你自己处理下
class MyError ( Exception) :
pass
def add ( a, b) :
if a < 0 or b < 0 :
raise MyError( '参数用不能有负数' )
r = a + b
return r
print ( add( - 1 , 2 ) )