...

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,并发送原文链接。

posted @   韩志超  阅读(344)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu