从零开始的Python计划9.2--异常

异常

异常:程序运行时发生的错误。
–----通常会导致程序突然停止

追溯:是一条错误消息,它提供导致异常的行号信息。(可以看出是哪条代码造成了错误)
-----指示异常的类型以及导致引发异常的错误的简要描述

举例:

def read_number():
       num = int("eleven")#这会引起一个异常,因为eleven是一个字符串,不能用整数int
   read_number()


就会得到以下错误:
Traceback (most recent call last):
     File "C:\......\Lecture_5.py", line 3, in <module>
       read_number()
     File "C:\......\Lecture_5.py", line 2, in read_number
       num = int("eleven")
   ValueError: invalid literal for int() with base 10: 'eleven'

避免异常

通过仔细编码可以防止许多异常。
----示例:输入验证(当我们有输入时,在输入系统之前,可以检查输入是否符合我们的要求)
通常需要一个简单的决策结构:(举例)

 if N > 0:
        math.sqrt(N)
 如果传递的值为0或者更低,就会给出一个错误。
 通过这样事先写一个if语句可以确保我们的N是一个理想的值。

一些异常无法通过仔细的编码来避免。
-----比如试图将非数字字符串转换为整数,
-----试图打开一个读取不存在的文件。

异常处理

异常处理程序:在引发异常并防止程序崩溃时响应的代码。
在Python中,使用try/except语法来捕捉错误。

格式:
try:
statements
except exceptionName:
statements

尝试套件:可能引发异常的语句
处理程序或例外部分:except块中包含的语句

举例:
在这里插入图片描述
有一个函数,它把num1除以num2
但是不能把12除以0,任何数字都不能除以零。
在这里插入图片描述
我们知道用户可以输入0
我们可以编写另一个类似的函数:
在这里插入图片描述
取两个数字把它们相除,不一样的是:
不是仅仅像之前分开,而是用try语句把数字相除,
如果得到零语法错误 (ZeroDivisionError是确切的错误名称),就会打印异常。因此,这样操作后,代码的结果会是一个恰当的结果。
在这里插入图片描述

处理多个异常

尝试套件中的代码通常可以引发不止一种类型的异常。需要为每种需要处理的异常类型编写except子句。所以正确的做法是尽量具体化。
在这里插入图片描述
有一个除数函数,从输入中取两个数,然后打印数字除以数字的结果。

假设我们输入的数字是这样的:
在这里插入图片描述
我们就会有ValueError

在这里插入图片描述
如果是这样的,就会有一个零除法错误。

为了避免这样的错误发生,可以写一个try/except语句:
在这里插入图片描述
捕捉值错误的同时也能捕获零除法错误。一旦捕捉到,就会实行打印对应的语句。

不列出特定异常的except子句将处理try套件中引发的任何异常。当我们不确定有多少异常时,但是想全部捕获,可以直接靠except:
在这里插入图片描述
这样就能捕捉到python可能给我们带来的每一个错误。

显示异常的默认错误消息

异常对象:抛出异常时在内存中创建的对象。
–—通常此对象包含与异常相关的默认错误消息
–—可以将异常对象分配给except子句中的变量
(except子句使我们能够进入并捕获这个异常对象以获取更多信息)
–—可以将异常对象变量传递给print函数以显示默认错误消息。

def main():
    total = 0
	try:(有一个try语句试图做一些事情)
		infile = open('sales_data.txt', 'r') (打开一个文件,读取文件的第一行)
		string = infile.readline()
    except FileNotFoundError as exp:(运行except语句)
        print(exp)
该对象已存储在内存中,而且能够显示出错误。

else子句

try/except语句可能包含可选的else子句,该子句出现在所有except子句之后。
----else子句与try 和 except子句对齐
----语法类似于决策结构中的else子句
----Else套件:仅在未引发异常的情况下,在try套件中的语句之后执行的语句块。如果引发异常,则跳过else套件

格式:

try:
	statements
except exceptionName:
	statements
else:(只有在try成功的情况下才会运行。如果try不成功并且抛出错误,将只运行except子句。)
	statements

举例:
在这里插入图片描述
如果传递12和0,实际上会导致ZeroDivisionError错误,就会打印except中对应的语句和异常的对象。
在这里插入图片描述
下面的例子中就是try中没有造成任何错误:
就会跳下去运行else
在这里插入图片描述
在这里插入图片描述

finally子句

try/except语句可以包含可选的finally子句,它出现在所有except子句之后。
----与try 和 except子句对齐
----Finally套件:Finally子句后的语句块
----无论是否发生异常,finally套件都会被执行
----目的是在退出之前执行清理。

所以可以用finally子句在退出except之前运行一些清理代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值