0
点赞
收藏
分享

微信扫一扫

Python基础10-异常处理


异常处理

代码运行难免出错,我们期望程序按一定方式运行,其中难免出现没有意料到的错误,这种称为异常。
一般情况下,异常会导致程序中断退出,为避免程序中断,我们需要对异常进行处理,在Python中我们使用​​​try ... except ...​​语句处理异常,例如:

def div(a, b):
try:
return a / b
except Exception as ex:
print('出现异常', type(ex), ex)

div(1, 0)
div(1, 'a')

这里使用Exception代表任何异常, as ex是对异常添加别名,ex就是具体的异常对象,运行后输出:

出现异常 <class 'ZeroDivisionError'> division by zero
出现异常 <class 'TypeError'> unsupported operand type(s) for /: 'int' and 'str'

一般来说,建议对不同类型的异常进行单独处理,例如:

def div(a, b):
try:
return a / b
except ZeroDivisionError:
print('被除数b不能为0')
except TypeError:
print('类型错误a和b应为数字')

div(1, 0)
div(1, 'a')

运行后结果如下:

被除数b不能为0
类型错误a和b应为数字

except也可以一次捕获多个异常,对任意一种异常做同一处理,例如​​try: ... except: (ZeroDivisionError, TypeError): ...​

无异常及无论是否有异常都执行的操作

异常处理支持使用​​try: ... except: ... ​​​后使用​​else: ...​​​在无异常时执行某些操作,及使用​​finally: ...​​,无论是否有异常都执行某些语句,例如:

def div(a, b):
try:
c = a / b
except ZeroDivisionError:
print('被除数b不能为0')
except TypeError:
print('类型错误a和b应为数字')
else:
print('结果为', c)
return c
finally:
print('执行结束...')

div(4, 2)
div(1, 0)
div(1, 'a')

执行结果如下:

结果为 2.0
执行结束...
被除数b不能为0
执行结束...
类型错误a和b应为数字
执行结束...

Python中常见异常

异常类型

说明

示例

SyntaxError

Python语法异常(缩紧或语法错误)

int a = 1

NameError

变量名异常(不存在该变量名)

print(a)

TypeError

变量类型异常

print('a'/ 'b')

ValueError

值异常(变量值异常)

int('a')

ZeroDivisionError

0除异常(被除数不能为0)

10/0

IndexError

索引异常(列表等中不存在该索引对应的值)

s = ['a', 'b', 'c'] ; print(s[5])

KeyError

键异常(字典中不存在这个Key对应的值)

s = {'a':1, 'b':2, 'c':3} ; print(s['d'])

AttributeError

获取属性异常(对象没有该属性)

a = 'hello'; print(a.name)

AssertionError

断言异常(断言未通过)

assert 1>2

FileNotFoundError

文件不存在

open('abc.txt')

OSError

操作系统错误

os.mkdirs('/ddd/xxx')

主动抛出异常

在编写程序中不一定要捕获并处理(抑制)所有异常,有时候快速抛出异常并清楚的说明原因也是一种比较好的使用方式,例如:

def div(a, b):
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise ValueError('a和b必须为int或float类型')
if b == 0:
raise ValueError('被除数b不能为0')
return a / b

div(1, 0)
div(1, 'a')

也可以自定义异常类型进行抛出,以使的错误类型更清晰,例如:

class NotNumberError(Exception):
"""非数字异常"""

class CannotBeZeroError(Exception):
"""不能为0异常"""


def div(a, b):
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise NotNumberError('a和b必须为int或float类型')
if b == 0:
raise CannotBeZeroError('被除数b不能为0')
return a / b

div(1, 0)
div(1, 'a')

举报

相关推荐

0 条评论