python的异常学习简总

python学习之异常学习


python中常见的异常类型
  1. NameError:尝试访问一个为申明的变量。
  2. ZeroDivisionError:除数为零错误。
  3. SyntaxError:解释器语法错误,这是一个唯一不在运行时发生的异常,在运行前解释器就会显示其错误。
  4. IndexError:请求的索引超出范围。
  5. KeyError:请求一个不存在的字典的关键字。
  6. IOError:输入/输出错误(IO错误)。
  7. AttributeError:尝试访问未知的对象属性。
  8. TypeError:类型错误,参数等类型不匹配。
  9. Exception:捕获所有异常。

python检测和处理异常

异常处理使用主要有两个语句

try:
    pass
except 错误类型 as e:
    print(e)
    pass
    
try:
    pass
finally:
	pass
注意
  1. try中的代码发生错误抛出异常,except根据自己的异常类型判断是否捕获这个异常。一个try可以跟多个except。和C++类似,Exception异常类型可以捕获除了sys.exit()抛出的程序退出类型以外的任何异常类型。as e是产生一个异常类型的对象,然后print(e)会打印出异常类型信息。
  2. 如果try中代码未发生异常,就会跳过。如果try中出现异常,但是except的异常类型与异常不匹配,那么程序就会在异常语句直接挂掉
  3. try-finally子句,finally子句只能有一个,也可以使用try-except-finally混合语句。finally的语句无论错误是否发生都会被执行。如果是混合的话finally写在最后。
  4. 也可以指定确定的异常类型,因为一般代码中不同的异常可能补救处理不同,使用try和多个except即可。
  5. 如果对于某个类型异常你不想做处理,你可以在其except代码块中写pass即可,但是程序会报错。
异常处理中else关键字
try:
    pass
except TypeError:
    print("类型错误")
else:
    print("else子句")
finally:
    print("finally子句")
  • 一个try-except-finally语句中只能有一个else,并且else必须在except后面,如果没有异常发生,也就是没有执行except那就会执行else,else必须放在except和finally中间。

异常语句可以跨层次

下一个简单的代码来说明

def func(s):
    return 10 / int(s)

def help(s):
    return func(s) * 10

def main():
    try:
        help('0')
    except Exception as e:
        print(e)
    finally:
        print("finally")

main()

""" 结果:
division by zero
finally
"""

上面的代码就实现了跨层次的捕获异常,首先func将异常抛给help然后help将异常抛给main,然后main处理异常。


主动触发异常

raise语句就是用来出动主动抛出异常的,类似于C++的throw一样,使用格式如下:

def div(a,b): # 做a/b
    if b == 0:
        raise ZeroDivisionError("division by error")
    return a / b

自定义异常类型

自己实现一个类,然后需要继承Expection类。

class MyError(Exception):
    def __init__(self,msg):
        self.mymsg = msg

    # 重载print函数
    def __str__(self):
        return self.mymsg

try:
    raise MyError("my error")
except MyError:
    print("MyError")

断言

和C中的assert一样,如果assert子句条件不成立就会抛出AssertionError类型的异常。否则就不做任何事。

a = 12
b = 0
assert b != 0,"division by zero"
tmp = a / b
print("end")


a=12
b=0
try:
    assert b != 0,"division by zero"
    tmp = a /b
except AssertionError as a:
    print(a)

第一种代码程序会崩溃,并打印字符串;第二种也可以直接捕获异常。

更多详解可以看《python核心编程第二版》
附上下载连接:
链接:https://pan.baidu.com/s/1GTEmWgzFsZY1ESsLN-FnZA
提取码:cpit


简单总结,如有错误!请批评指导!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值