Python之异常处理

Python 异常处理

1.捕获异常  (作用:程序运行过程中,可能会出现意想不到的异常,如果异常未被解决,程序会崩溃,停止运行)

#例如,以下例子
a='name'
print(a[10])  #报错:IndexError: string index out of range
print('今天是个好天气')  #报错后面的程序将不会执行

所以,异常处理就显得很有必要

捕获异常的基础语法:

1.处理异常定义,如果出现异常,我们会让它按照事先规定的规则去执行对应的操作,从而记录报错的log日

2.语法:

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

  (缩进)存放可能出现报错的代码模块

except(异常):

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

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

try:
    a = 'name'
    print(a[10])
    print('今天是个好天气')

except:
    print('try模块存在报错,后续程序不能被执行')

输出结果:
try模块存在报错,后续程序不能被执行

3.如果try模块下的代码没有出现异常,则正常执行,不会执行except模块下的代码

try:
    a = 'name'
    print(a[2])
    print('今天是个好天气')

except:
    print('try模块存在报错,后续程序不能被执行')

输出结果:
m
今天是个好天气

4.一般,在写异常处理模块时,都要预先考虑到,可能会出现报错的地方,然后将其放到try里面,从而防止报错影响程序的整体执行

#前期预判
a = 'name'
print(a[2])   #a变量是一个字符串,根据索引值取字符串的值,所以可能存在索引值超出字符串的长度的报错
print('今天是个好天气')

#案例二
b=12
c=23
print(b*c)

#b和c都是变量,如果给予b和c赋予的数据类型非int和float类型,那就会报数据类型的错误,所以此处就需要加  异常处理

5.使用try......except......语句捕获了异常,但是不清楚是哪里出现问题,是数据类型错误、超出范围错误还是其他的错误等等

面对以上的问题,可以使用 except  Exception as err:将错误类型赋值给err  ,打印出来

try:
    a = 'name'
    print(a[20])
    print('今天是个好天气')

except Exception as err:
    print('try模块存在报错{},后续程序不能被执行'.format(err))

输出结果:
try模块存在报错string index out of range,后续程序不能被执行

注意:工作当中,最好用以上的方法捕获异常,这样就可以很直观的看到报错的内容,也好定位问题

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

方法:先不加异常,执行代码,查看程序可能出现的报错类型,然后将报错的类型加入except 语句中就行

语法:

try:

  (缩进)执行的代码模块

except  报错类型  as  err:

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

finally:    ---------------->该模块属于,不管有没有报错,里面的代码都会被执行

    (缩进)  print('你好世界')

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
'''

7.手动抛出异常 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

'''

8.错误类型介绍(以下错误类型,可以接下来了解使用)

ImportError :无法引入模块或包

IndexError:下标索引超出序列边界

NameError:使用一个还未赋予对象的变量

TypeError:传入的对象类型与要求不符合

SyntaxError:代码逻辑语法错误,不能执行,不能捕获

ValueError:传入一个不被期望的值,即使类型不正确

KeyError:试图访问你字典里不存在的key

IOError:输入输出异常,文件操作

9.异常分组

好处:如果我们发现了一个验证级别为阻塞级别的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,因为可以报错异常,但是也不知道报的是什么异常,再次排查问题时,会很浪费时间

原文地址:https://www.cnblogs.com/lucky1212/p/14076433.html