python异常处理基础入门

1.第一个异常(除以0异常),当输入0的时候,系统提示第四行引发异常报错

#第一个异常处理,除以0异常
i=input("请输入第一个数字:")
n=1000
result=n/int(i)
print("{}除以{}等于{}".format(n,i,result))

 为何会出现ZeroDivisionError: division by zero?Tractback提示信息代表什么?,Tractback信息是指"异常堆栈信息",描述了程序运行的过程以及引发异常的信息,上述便出现了引发异常的信息,在第四行引发异常 发生异常的表达式为 result=n/int(i) ,异常信息的描述是ZeroDivisionError: division by zero ,一般来说异常类命名的主要后缀有Exception ,Error,Warning 如何捕获这些异常了?对于上述的例子,我们不能防止用户输入0,但我们在出现异常的时候可以捕获这些异常,并对这些异常进行处理,让程序继续运行下去,而不是终止程序退出。

1.1异常的捕获

如何捕获异常呢?需要借助try-except语句实现,基本的语法如下:在try代码块中,包含可能会引发异常的语句,如果没有引发异常,那么程序便跳到except代码块执行,这就是异常的捕获,大白话就是,在try代码块中放入可能出现异常的语句,在except代码块中处理这个异常

1.2语法格式:

try:

    <可能引发异常的语句>

except[异常的类型]:

    <异常的处理>

需要注意的是,异常的类型可以省略不写

1.3try-except执行流程如下:

1.4示例代码修改:

#异常捕获
i=input("请输入一个数字:")
n=1000
try:
    result=n/int(i)
    print(result)
    print("{}/{}={}".format(n,i,result))

except ZeroDivisionError as e:#指定ZeroDivisionError异常类型
    """ 捕获除数为0的异常 """
    print("除数不能为0,发生异常:{}".format(e))#e为异常对象,是一个变量

1.5多个except代码块:

     多条语句可能会引发多种不同的异常,对每一种异常都会采用不同的处理方式。针对这种情况,我们可以在一个try后面跟多个except代码块,语法如下:

最后一个except代码块是默认的except代码块,只能放到最后,捕获上面没有匹配的异常类,多个的except代码块根据异常类型匹配到不同的except代码块

示例代码如下:

键盘输入字母g,引发异常,打印异常信息,当然你也可以输入0,引发异常

#一个try后面跟着多个except代码块
i=input("请输入一个数字:")
n=1000
try:
    result=n/int(i)#可能引发除数为零的异常,和引发类型转换的异常,放try代码块中
    print(result)
    print("{}/{}={}".format(n,i,result))

except ZeroDivisionError as e:
    print("除数不能为零,发生异常:{}".format(e))

except ValueError as e:
    print("输入的不是数字,发生异常:{}".format(e))

1.6多重异常捕获

    假若多个的except代码块的异常处理过程类似,便可以合并处理,这便是多重异常捕获,因为多个打except代码块,会增加代码量,示例代码如下:

输入jjjj,捕获类型异常,当然你也可以输入0,捕获异常

#多重异常捕获实例:
i=input("请输入一个数字:")
n=1000
try:
    result=n/int(i)
    print(result)
    print("{}/{}={}".format(n,i,result))
except(ZeroDivisionError,ValueError) as e:
    print("发生异常:{}".format(e))

1.7try-except语句嵌套

#try-except语句嵌套
i=input("请输入一个数字:")
n=1000
try:
    i1=int(i)
    try:
        result_2=n/i1
        print("{}/{}={}".format(n,i1,result_2))
    except ZeroDivisionError as e:
        print("除数不能为0,发生异常:{}".format(e))
except ValueError as e:
    print("输入的不是数,发生异常:{}".format(e))

当输入0的时候,捕获异常,当然你也可以输入一些字符串,捕获到类型异常

分析 :假如我们在键盘上输入0,程序进入第一个try代码块,对于i1=int(i),不会引发异常,继续正常执行try代码块的第二条语句,接着进入到第二个try代码块,执行里面的语句,引发异常,跳转到对应的except代码块执行,执行完 ,程序结束

分析:假如我们在键盘上输入"ahdd",程序进入到第一个try代码块,执行i1=int(i),引发类型转换异常,程序跳转到对应的except代码块执行,执行完后 程序运行结束

2:使用finally代码块释放资源

有时在try-except语句中会占用一些资源,例如打开的文件、网络连接、打开的数据库及数据结果集等都会占用计算机资源,需要程序员释放这些资源。为了确保这些资源能够被释放,可以使用finally代码块,在try-except语句后面还可以跟一个finally代码块,语法如下

注意:无论是try代码块正常结束还是except代码块异常结束,都会执行finally代码块。

代码如下:

#使用finally释放资源
i=input("请输入一个数字:")
n=1000
try:
    result=n/int(i)
    print("{}/{}={}".format(n,i,result))
except ZeroDivisionError as e:
    print("除数不能为0!,发生异常:{}".format(e))
except ValueError as e:
    print("输入的不是数字!,发生异常:{}".format(e))
finally:
    print("释放资源")

不管try代码块里面是否异常,有异常执行到except代码块,结束 最后接着运行finally语句,如果没有异常正常执行不会执行except代码块,运行完 最后同样执行finally语句

3自定义异常类:

当然你也可以自己编写你的异常类,提高代码的复用性,实现异常类需要继承Exception类或者继承Exception的子类,对于上述的例子的两个异常类 ZeroDivisionErro, ValueErro都是Exception的子类

3.1实现自定义异常类:

encoding="utf-8"
#自定义异常类MyException
class MyException(Exception):
    """ 自定义异常类 """
    def __init__(self, message):    # 定义MyExceptio类构造函数,接收参数message,表示异常描述信息
        super().__init__(message)# 调用父类Exception的构造函数,传入参数message
        
i=input("请输入一个数字:")
n=1000
try:
    result=n/int(i)
    print(result)
    print("{}/{}={}".format(n,i,result))
except ZeroDivisionError:
    #print("除数不能为0!,发生异常:{}".format(ZeroDivisionError))
    raise MyException("除数不能为0!")
except ValueError:
    #print("输入的不是数字,发生异常:{}".format(ValueError))
    raise MyException("输入的不是数字!")

其中raise是抛出异常的关键字,后面跟着异常对象,表示抛出指定的异常

4.简单的练一练

4.1 请列举一些常见的异常。

4.2 手动引发异常的语句有哪些?()

A.throw

B.raise

C.try

D.except

4.3 判断对错:(请在括号内打√或×,√表示正确,×表示错误)。

1)每个try代码块都可以伴随一个或多个except代码块,用于处理try代码块中所有可能引发的异常。()

2)为了确保这些资源被释放,可以使用finally代码块。()

3)实现自定义异常类时,需要继承Exception类或其子类。()

4)为了提供程序的健壮性,我们应该对所有类型异常都进行捕获。()

5)一个整数除以0时会引发ValueError异常。()

5总结:

异常处理会提高代码的健壮性,学了异常的捕获和finally代码块,和自定义异常类,以及引发异常手动的,在进行异常捕获的时候,使用try-except语句实现,在except语句中,可以明确的指定异常类型,使得可以精准的捕获异常 在一个try代码块中,可以跟着许多的except代码块,但最后一个代码块要省略异常的类型。try-except语句还可以嵌套try-except语句,但会显得程序复杂,不是太建议。推荐一个可以实现程序执行过程的网站:https://pythontutor.com/render.html#mode=edit

可以学习python官方文档,进行学习,语言可以选成中文的,Python 教程 — Python 3.12.3 文档Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和动态类型以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的理想语言。 Python 官网( https://www.python.org/ )上免费提供了 Python 解释器和扩展的标准库,包括源码和适用于各操作系统的机器码形式,并可自由地分发。P...icon-default.png?t=N7T8https://docs.python.org/zh-cn/3/tutorial/index.html

一个数据结构算法可视化的网址,可以选择自己喜欢的语言运行,进行学习

序 - Hello 算法动画图解、一键运行的数据结构与算法教程icon-default.png?t=N7T8https://www.hello-algo.com/chapter_hello_algo/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值