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')
作者:韩志超
出处:https://www.cnblogs.com/superhin/p/16114170.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如有问题,请微信联系 superz-han,并发送原文链接。
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现