python学习之错误和异常处理

本文介绍了Python中的错误和异常处理,包括语法错误和逻辑错误的区别,常见的错误类型如SyntaxError、NameError等,以及异常处理的步骤。详细阐述了try-except、try-except-else、try-finally等异常处理结构,还提到了with语句的作用和上下文管理器的工作原理。同时,文章讨论了raise语句用于主动抛出异常以及assert语句的使用。最后,概述了Python的标准异常和如何自定义异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

错误:

1:语法错误:代码不符合解释器或者编译器语法
2:逻辑错误:不完整或者不合法输入或者计算出现问题
编译器或者解释器可以检查出语法错误,但检查不出逻辑错误。

常见错误

SyntaxError 语法错误
NameError 变量未定义
IOError IO错误(读写文件)
ZeroDivsionError 10/0 0除错误
ValueError 强制类型转换错误 a = int(‘dd’)
KeyboardInterrupt ctrl+c强制退出正在运行的程序时报

异常:

程序执行过程中出现问题导致无法继续进行
1:程序遇到逻辑或者算法问题
2:运行过程中计算机错误(内存不够或者IO错误)

异常的两个步骤

1:异常产生,检查到错误且解释器认为是异常,抛出异常
2:异常处理,截获异常,忽略或终止程序处理异常

try-except 异常处理

try:
    try_suite
except Exception1 as e:
    exception_block
except Exception2 as e:
    exception_block
    ...

1:try用来捕获try_suite宏的错误,并将错误交给except处理
2:except用来处理异常,如果发生的异常和设置捕获的异常一直,则使用exception_block处理异常
3:使用多个except可以处理多个异常类
3:如果except后面不跟具体内容,则捕获所有运行时产生的异常
4:捕捉到异常之后,代码可以继续运行,否则代码会中止运行

try:
    a
except NameError as e:
    print("catch Error:", e)
print("exec over")

try-except–else

如果没有异常,执行else语句中的代码

try:
    try_suite
except Exception1 as e:
    exception_block
else:
    none_exception

try-finally

try:
    try_suite
finally:
    do finally

1:如果try语句没有捕获错误,代码执行do_finally语句
2:如果try语句捕获错误,程序首先执行do_finally语句,然后将捕获到的错误交给python解释器处理
无论是否检测到异常,都会执行finally代码,
finally语句主要用于做一些清理工作,用来关闭文件或者释放系统资源

try-except-finally

try:
    try_suite
except Exception as e:
    exception_block
finally:
    do finally

1:若try语句没有捕获异常,执行完try代码段后,执行finally
2:若try捕获异常,首先执行except处理错误,然后执行finally

try-except-else-finally

try:
    try_suite
except:
    do_except
else:
    do_else
finally:
    do_finally

1:若try语句没有捕获异常,执行完try_suite后,执行do_else,最后执行do_finally
2:若try捕获异常,首先执行do_except处理异常,然后执行finally

with语句

with context [as var]:
    with_suite

1:with语句用来代替try-except_finally语句,使代码更简洁;
2:context表达式返回一个对象;
3:var用来保存context返回对象,单个返回值或者元组
4:with_suite使用var变量来对context返回对象进行操作

with本身不能处理异常,可以包裹在try-except中,但省略了finally

with 语句实质是上下文管理:
1:上下文管理协议:包含方法_enter_()和_exit_(),支持该协议的对象要实现这两个方法
2:上下文管理器:定义执行with语句时要建立的运行 时上下文,负责执行with语句块上下文中的进入与退出操作
3:进入上下文管理器:调用管理器_enter_()方法,如果设置as var语句,var变量接收_enter_()方法返回值
4:退出上下文管理器:调用管理器_exit_()方法

class Mycontext(object):
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        print("__enter__")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("__exit__")
        print("Error:", exc_type, "info:", exc_value)

    def do_self(self):
        print("do_self")

if __name__ == '__main__':
    with Mycontext('test context') as f:
        print(f.name)
        f.do_self()

with语句应用场景:
1:文件操作;
2:进程线程之间互斥对象,如互斥锁;
3:支持上下文管理的其他对象

raise语句

raise语句用于主动抛出异常
语法格式:raise[exception(,args)
exception:异常类
args:描述异常信息的元组

assert语句

断言语句:assert语句用于检测表达式是否为真,如果为假,引发AssertionError错误
语法格式:assert expression [,args]
expression:表达式
args:判断条件的描述信息
注:产生的AssertionError可以交给系统解释器处理,也可以主动处理

标准异常

python内建异常,程序执行前就已经存在
BaseException:
https://docs.python.org/3/library/exceptions.html?highlight=baseexception
KeyboardInterrupt 用户中端(ctrl+c)
Exception 常见错误的基类:
SyntaxError, NameError, IOError, ImportError…
SystemExit Python解释器退出

自定义异常

1:python允许自定义异常,用于描述python中没有涉及的异常情况;
2:自定义异常必须继承Exception类
3:自定义异常只能主动触发

class FileError(IOError):
    pass


try:
    raise FileError('test')
except FileError as e:
    print(e)
class CustomError(Exception):
    def __init__(self, info):
        Exception.__init__(self, info)
        self.errorinfo = info
        print(id(self))

    def __str__(self):
        return "CustionError:%s" % self.errorinfo


try:
    raise CustomError('mine ')
except CustomError as e:
    print('ErrorInfo:%d, %s' % (id(e), e))

抛出的异常与产生的对象是同一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值