Python基础语法 第9节课(异常处理)

异常处理

一、捕获异常

1.背景:即程序出现了意想不到的情况,bug,如果异常不解决,程序会崩溃,停止运行

lst = ['hello']
#此处有很多行代码
print(lst[9])#异常,取不到索引为9的数据
print('running')#后面的代码都无法再正常运行
.
.
.

最基础的异常捕获

2.异常捕获(捕获异常)

如果出现异常,我们会让它按照事先规定的规则去执行对应的操作,记录错误日志:log

语法:

try(要运行有可能出现异常的代码):

  要运行的代码

except(异常):

  出现异常的时候要运行的代码(执行的操作),记录日志

注:1.try的语句会执行,不然就不会报错了。

  2.一旦try里面的代码报错,立即跳到except,try报错代码的下面的剩余语句将不会执行

lst = ['hello']
try:
    print(lst[9])
except:
    print('记录错误日志')
print('running....')
print('finish')
'''
记录错误日志
running....
finish
'''

  3.如果try里面的代码没有出现异常,就不会执行except

lst = ['hello']
try:
    print(lst[0])
    print('python-lemon')#try里面没有异常,都会执行完,不会进入except
except:
    print('记录错误日志')
print('running....')

'''
hello
python-lemon
running....
'''

3.try......except Exception as err......

好的程序员:知道什么代码需要放到try里面

#需不需要加异常??
a = 4
b = 2
print(a*b)

a,b是变量,事先不知道是什么数据类型,就需要加异常,否则如果输入的是字符串,列表啥的,就会报错;如果事先知道就是int/float,就不需要加异常

a = '4'
b = 'q'
try:
    print(a*b)
except:
    print('参数错误,记录日志')

上面的try.....except....捕获了异常,但是不知道到底是哪里出了bug.下面用:except Exception as err.会把错误类型赋值给err

a = 4
b = 0
try:
    print(a/b)
except Exception as err:
    print('出现了异常:{}'.format(err))
#结果:出现了异常:division by zero

在实际操作中,最好用这个方法(try......except Exception as err......)。

4.异常捕获的进阶:指明出现的异常类型

先不要加异常,让它报错(开发主动报错),将报错的类型记住,去异常捕获的时候,加入except语句中

语法:

try:

  代码

except 错误类型 as err:

  print('异常{}'.format(err))

finally:-------------------→不管有没有报错,finally里面的代码都会执行。

  print('hello word')

lst = ['hello']
a = 4
b = 0
try:
    print(a/b)
    print(lst[2])
except IndexError as err:
    print('出现了异常:{}'.format(err))
except ZeroDivisionError as err:
    print('出现除法异常:{}'.format(err))
finally:
    print('hello wold')

#结果:
'''
出现除法异常:division by zero
出现除法异常:division by zero
hello wold
'''

二、手动抛出异常raise

raise手动抛出异常,让程序终止运行

def join_team(age,gender):
    if age > 22:
        raise ValueError('年龄要小于22')
    print('可以加入team')

print(join_team(23,'girl'))
'''
    raise ValueError('年龄要小于22')
ValueError: 年龄要小于22

'''

错误类型介绍

ImportError:无法引入模块或包
IndexError:下标索引超出序列边界
NameError:使用一个还未赋予对象的变量
SyntaxError:代码逻辑语法错误,不能执行,不能捕获
TypeError:传入的对象类型与要求不符合
ValueError:传入一个不被期望的值,即使类型正确
KeyError:试图访问你字典里不存在的key
IOError:输入输出异常,文件按操作

1.SyntaxError --------语法错误不能被捕获

try:
    ldljsdjlg'khkhkh'
except:
    print('语法错误')
#结果显示错误,不能捕获异常
'''
    ldljsdjlg'khkhkh'
                    ^
SyntaxError: invalid syntax
'''

2.KeyError

dict1 = {'1':'one','2':'two'}
print(dict1['3'])
'''
    print(dict1['3'])
KeyError: '3'
'''

3.IndexError

lst2 = [1,5,[8,9],'hello']
print(lst2[5])
'''
    print(lst2[5])
IndexError: list index out of range
'''

4.ValueError

a  = 4
print(int('a'))
'''
    print(int('a'))
ValueError: invalid literal for int() with base 10: 'a'
'''

三、异常分组

好处:如果你们发现了一个验证级别为阻塞级别的bug,短信通知开发人员马上集合解决问题

如果不同的错误类型,异常处理的行为是一样的(短信通知),组合起来,可以简化代码。

try:
    1 / 0
    ['hello'][3]
    {'name':'pyrhon'}['age']
except (IndexError,KeyError) as  e:
    '短信通知这里出现很严重的问题'
    print('可以捕获IndexError和KeyError')
except ZeroDivisionError as e:
    '记录日志'
    print('除法出现异常{}'.format(e))

最好不要直接用Exception,因为自己都不知道报什么错!------------最好避免!

try:
    1/0
except Exception as e:
    print('其他类型的异常')

四、了解即可

try:

  .....

except :

  .......

else:

  ........

  

原文地址:https://www.cnblogs.com/ananmy/p/12873472.html