Python3--异常

一.引入:

Python是解释型语言,会整体扫描一下代码,如果有语法错误,则整个程序完全不会执行。如下:

def myfun():
    print('哈哈哈哈哈哈哈')
    print(‘嘻嘻嘻嘻')#这里是中文的括号
    print('嘿嘿')

myfun()


没有语法错误的时候一行行检查,直到扫描到其他错误的位置,停止执行。(在扫描到错误之前正确的代码还是会执行的)如下:

def myfun():
    print('哈哈哈哈哈哈哈')
    b = 'hello' + 15#类型错误
    print(b)
    print('嘿嘿')

myfun()



python中所有的异常都是继承自BaseException,分为四大类:

类型描述
SystemExitpython退出异常
Keyboardlnterrupt键盘打断(ctrl + c)
GeneratorExit生成器退出
Exception普通异常

二.异常


三.try......except捕获异常:

try:
    with open('a.txt','r') as f:
        f.read()
except: #在pycharm中会有波浪线,因为没有加具体的异常
    print('没有找到又怎么样呢?')#当a.txt不存在时会打印
#运行结果:
没有找到又怎么样呢?

当try中的代码没有报错时,except就不会执行,当try中的代码出错时,会执行except中的代码

try:
    a = 0
    b = 1/a
except:
    print('没写错!')

捕获具体的异常:

try:
    with open('a.txt','r') as f:
        f.read()
except FileNotFoundError:#增加了具体的异常类型
    print('没有找到又怎么样呢?')#当a.txt不存在时会打印

当增加了a = 0, b = 1/a这个错误的时候,在with之后,它不会被捕捉到,因为with已经出错,直接执行except;如果a = 0, b = 1/a,放在with之前,则会报错

try:
    with open('a.txt','r') as f:
        f.read()
        a = 0
        b = 1/a
except FileNotFoundError:
    print('没有找到又怎么样呢?')#当a.txt不存在时会打印
#运行结果
没有找到又怎么样呢?

再增加一个异常:

try:
    a = 0
    b = 1 / a
    with open('a.txt','r') as f:
        f.read()
except FileNotFoundError:
    print('没有找到又怎么样呢?')#当a.txt不存在时会打印
except ZeroDivisionError:
    print('这是分母为0的一个错误')
#运行结果
这是分母为0的一个错误

捕获多种异常:

try:
    raise TypeError('嘿嘿嘿,这是一个类型错误') #主动抛出一个异常
except FileNotFoundError:
    print('没有找到又怎么样呢?')#当a.txt不存在时会打印
except ZeroDivisionError:
    print('这是分母为0的一个错误')
except Exception as e:
    print(e)#打印出主动抛出的异常

主动抛出异常:

def myfunc(num):
    if type(num) != int:
        raise TypeError('不是数字')
    return num * 10

print(myfunc('hello'))

运行结果:

四.更加丰富的结构

try:

except...:

else...:   在没有错误的时候执行

finally:  无论如何都会执行

当报错时:

def myfunc(num):
    if type(num) != int:
        raise TypeError('不是数字')
    return num * 10

try:
    print(myfunc('hello'))
except TypeError:
    print('代码出错了')
else:
    print('代码没有报错')
finally:
    print('不管怎样,我finally都会执行')
#运行结果
代码出错了
不管怎样,我finally都会执行

没有报错时:

def myfunc(num):
    if type(num) != int:
        raise TypeError('不是数字')
    return num * 10

try:
    print(myfunc(10))
except TypeError:
    print('代码出错了')
else:
    print('代码没有报错')
finally:
    print('不管怎样,我finally都会执行')
#运行结果
100
代码没有报错
不管怎样,我finally都会执行

五.断言

不使用断言:

if not False:
    raise Exception('条件不满足')

使用断言:

assert True #不抛出异常
assert False  #抛出异常

例:

def myfunc(num):
    assert type(num) == int  #相当于 if type(num) != int:  raise TypeError('不是数字')
    return num * 10

print(myfunc('hello'))

运行结果:


六.自定义异常类型

class NameMustBeNanBeiError(Exception):
    pass

def myfunc(name):
   if  name != '哈哈':
       raise NameMustBeNanBeiError('必须要是哈哈哦~')

try:
    print(myfunc('嘿嘿'))
except Exception as e:
    print(e)
#运行结果:
必须要是哈哈哦~


练习1

如果我用w模式正常的打开了文件,然后write时候如果报错呢?

那么我怎么正常关闭文件?

import os

if not os.path.exists('my_tesr.txt'):   # 判断文件是否存在
    file = open('my_test.txt', 'w+', encoding='utf-8')
    
    try:
        my_dict = {'name': 'xiaojiu'}
        file.write(my_dict['name'])
        
    except Exception as e:
        print(e)
        
    finally:
        file.close()
        print('文件正常关闭')
        
# 文件存在则不会运行try 





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值