HuaPu在学:Python基础知识—PyCharm版【异常】


前言

“花圃记录学习日常”。刚开始走上Python之路,以下都是入门基础内容的一些要点笔记。


一、导引

我们可以设想一下,如果在一条公路上我们在行驶过程中遇到阻挡继续前进的石头,我们实际上是希望我可以绕过石头继续正常前进的,而不是遇到了石头就停下来,后边的路先不管了。

1.异常机制本质

异常:指的是程序运行过程中出现了非正常的现象(Exception)。
异常处理:出现问题依然可以正常执行剩余的程序,不会因为异常而终止程序的执行。

2.异常的处理过程

抛出异常:再执行一个方法的时候,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行的路径,并把该异常对象交给解释器。

捕获异常:解释器得到该异常对象之后,寻找相应的代码去处理该异常。

二、try—except结构

1.try…一个except结构

try…except结构是最常见的异常处理结构。

try:
被监控的可能会引起异常的语句块
except BaseException as e:
异常处理的语句块

那么执行的原则是这样的,如果try部分的程序没有出现任何异常,那么程序会跑完try部分的代码,而不执行(跳过)except部分的代码。如果try部分出现了异常,那么从异常开始的语句往后的部分都不在去执行,直接跳到except部分去执行其中的语句。
整个try…except模块结构执行完跳出来,继续执行下边的程序。

try:
    print("执行step1")
    a=3/2
    print(a)
    print("执行step2")
except BaseException as e:   #这里是说把BaseException对象赋给e变量,方便后边调用
    print("执行step3")
    b=4/2
    print(b)
    print("执行step4")
    print("try部分的异常是{}".format(e))
    print("try部分的异常type是{}".format(type(e)))
    pass
print("跳出try…except结构")
输出结果:
执行step1
1.5
执行step2
跳出tryexcept结构
try:
    print("执行step1")
    a=3/0
    print(a)
    print("执行step2")
except BaseException as e:   #这里是说把BaseException对象赋给e变量,方便后边调用
    print("执行step3")
    b=4/2
    print(b)
    print("执行step4")
    print("try部分的异常是{}".format(e))
    print("try部分的异常type是{}".format(type(e)))
    pass
print("跳出try…except结构")
输出结果:
执行step1
执行step3
2.0
执行step4
try部分的异常是division by zero
try部分的异常type<class 'ZeroDivisionError'>
跳出tryexcept结构

2.示例

正常循环如下,但有一个问题就是,在用户端输入的如果不是数字,那么我就会直接报错停止我的程序,这是我们不希望的,我们希望是处理提示错误,并且重新开启下一次输入的循环。

while True:
    x=int(input("请输入一个数字:"))
    print(x)
    if x==88:
        print("退出循环")
        break
        pass
    pass
print("循环已经退出")
输出结果:
请输入一个数字:12
12
请输入一个数字:aa
Traceback (most recent call last):
  File "D:/Python/mypy01/04.py", line 54, in <module>
    x=int(input("请输入一个数字:"))
ValueError: invalid literal for int() with base 10: 'aa'

加入try-except:

while True:
    try:
        x=int(input("请输入一个数字:"))
        print(x)
        if x==88:
            print("退出循环")
            break
            pass
    except BaseException as e:
        print("异常,您输入的不是数字")
        print(e)
        pass
    pass
print("循环已经退出")
输出结果:
请输入一个数字:11
11
请输入一个数字:aa
异常,您输入的不是数字
invalid literal for int() with base 10: 'aa'
请输入一个数字:88
88
退出循环
循环已经退出

3.try…多个except结构

try…except结构是最常见的异常处理结构。

try:
被监控的可能会引起异常的语句块
except ValueError:
语句块
……
except BaseException as e:
异常处理的语句块

while True:
    try:
        x=float(input("请输入一个数字:"))
        y=float(input("请输入一个数字:"))
        print(x/y)
        if x/y==1:
            print("退出循环")
            break
            pass
    except ZeroDivisionError:
        print("除数y不能为0")
        pass
    except ValueError:
        print("输入x/y应该是数字,不能是字符串")
    except BaseException as e:
        print("其他异常")
        print(e)
        pass
    pass
print("循环已经退出")

输出结果:
请输入一个数字:1
请输入一个数字:a
输入x/y应该是数字,不能是字符串
请输入一个数字:1
请输入一个数字:0
除数y不能为0
请输入一个数字:1
请输入一个数字:1
1.0
退出循环
循环已经退出

4.try…except…else结构

执行顺序也很简单,try没有异常紧接着执行else这个模块,再去跳出整体结构执行下面程序,如果有异常那就执行except模块,在跳出整体的结构,执行下面的程序。

5.try…except…(else…)finally结构

try没有异常紧接着执行else这个模块,执行finally模块,再去跳出整体结构执行下面程序,如果有异常那就执行except模块,执行finally模块,在跳出整体的结构,执行下面的程序。【在申请关闭资源的时候finally结构好用,处理IO流打开文件】

try:
    f=open("C:/Users/(此处略去我的信息)/Desktop/Stu.Learning/finally.txt","r")
    content=f.readline()
    print("文件内容是{}".format(content))
    pass
except BaseException as e :
    print("未找到文件")
    pass
finally:
    try:
        f.close()
        print("关闭文件")
        pass
    except BaseException as e:
        print(e)
        pass
    pass
print("结束!")
输出结果:
文件内容是123456
关闭文件
结束!

三、常见异常问题

首先return语句不要放到异常处理结构中。
SyntaxError:语法错误
NameError:尝试访问一个没有被定义的变量
ZeroDivisionError:除数不能为零
ValueError:数值错误
TypeError:类型错误
AttributeError:访问的对象没有……属性
IndexError:索引越界
KeyError:关键字不存在
………
………

四、with上下文管理

首先声明一点是,with不是去取代上面的try except finally结构的,只是起到补充的作用,在文件管理和网络传递的开发。

with 可以自动地关闭打开的资源。

with open("C:/Users/(此处略去我的信息)/Desktop/Stu.Learning/finally.txt","r") as f:
    content=f.readline()
    print("文件内容是{}".format(content))
    pass
print("已经退出")
输出结果:
文件内容是123456
已经退出

五、traceback模块导入和打印异常日志

import traceback
try:
    print("step1")
    n=1/0
    pass
except:
    with open("C:/Users/(此处略去个人信息)/Desktop/Stu.Learning/finally.txt","a") as f:
        traceback.print_exc(file=f)
        pass
    pass

输出结果:
step1

日志情况:在这里插入图片描述

六、自定义异常类

class AgeError(Exception):
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo=errorInfo
        pass
    def __str__(self):
        return str(self.errorInfo)+"年龄应该在1-150之间"
    pass

if __name__=="__main__": #如果为True模块将作为独立文件执行
    age=int(input("请输入您的年龄:"))
    if age<0 or age>150:
        raise AgeError(age)  #如果满足if条件则抛出一个错误
    else:
        print("正常")
        pass
    pass
输出结果:
请输入您的年龄:200
Traceback (most recent call last):
  File "D:/Python/mypy01/04.py", line 101, in <module>
    raise AgeError(age)  #如果满足if条件则抛出一个错误
__main__.AgeError: 200年龄应该在1-150之间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值