目标:
- 异常的概念
- 捕获异常
- 异常传递
- 自定义异常
1.异常的概念
- 在程序运行时,如果Python解释器遇到一个错误,会停止程序的执行,并提示一些错误信息,这就是异常
- 程序停止执行并提示错误消息的操作通常称为异常
[En]
the action that the program stops execution and prompts an error message is usually called an exception*
- 程序在开发时,很难将 所有的特殊情况 都处理的面面俱到,通过 异常捕获 可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性
python中的异常:
- TypeError : 不同类型间的无效操作
- 不同类型的数据进行运算操作时,会引发TypeError异常
- 下述信息表明,”str”型数据不能直接与”int”型数据进行比较
birth = input("birth")if birth < 2000: print("00前")else: print("00后")
- ZeroDivisionError : 除数为0
- 当除数为0时,会引发ZeroDivisionError异常
- 下述信息表明,除数不能为0
print(1/0)
* NameError :
– 尝试访问一个未声明的变量时,会引发NameError异常
– 下述信息表明,解释器在任何命名空间里都没找到变量b
a = 1
c = a+b
print(c)
* SyntaxError :
– 当解释器发现语法错误时,会引发SynataxError异常
– 下述示例中,由于for循环的后面缺少冒号,所以导致程序出现如下错误信息
list_1 = [1,2,3,4]
for i in list_1
print(i)
* IndentationError :
– Python最具特色的就时依靠代码块的缩进来体现代码之间的逻辑关系,当缩进错误时,会引发IndentationError( 缩进错误)异常
– 下述示例中,由于for循环语句块没有缩进,所以导致程序出现如下错误信息:
list_1 = [1,2,3,4]
for i in list_1:
print(i)
* IndexError :
– 当使用序列中不存在的索引时,会引发IndexError( 索引超出序列的范围)异常
– 下述示例表明,列表的索引值超出了列表的范围
list_1 = [1,2,3,4]
print(list_1[4])
* KeyError :
– 当使用字典中不存在的键时,会引发KeyError( 字典中查找一个不存在的关键字)异常
– 下述信息表明,使用了字典中没有的键
dict_1 = {
"one":1,
"two":2
}
print(dict_1["one"])
print(dict_1["three"])
* ValueError :
– 当传给函数的参数类型不正确时,会引发ValueError(传入无效参数)异常
– 下述信息表明,int()函数传入了无效的字符串型参数
a = int("b")
* FileNotFoundError :
– 当试图用只读方式打开一个不存在的文件时,会引发FileNotFoundError (python3.2以前是 IOError) 异常
– 下述信息表名,没有找到名为”1.txt”的文件或目录
file = open("1.txt")
* AttributeError :
* 当尝试访问未知的对象属性时,会引发AttributeError(尝试访问未知的对象属性)异常
* 上述信息表明,在Car类中没有定义name属性,所以访问name属性时出现异常
class Car():
color = "black"
car = Car()
print(car.color)
print(car.name)
2.捕获异常
2.1简单的捕获异常的语法
- 在程序开发中,如果对某些代码的执行不能确定是否正确,可以增加 try(尝试) 来捕获异常
- 捕获异常最简单的语法格式:
[En]
the simplest syntax format for catching exceptions:*
*
try: 尝试执行的代码except: 出现错误的处理
- try 尝试,下方编写要尝试的代码,不确定是否能够正常执行的代码
- except 如果不是,下方编写尝试失败的代码
简单异常捕获演练-要求用户输入一个整数
[En]
Simple exception capture walkthrough-requires the user to enter an integer
1 #简单的捕获异常
2 try:
3 a = int(input("请输入一个整数"))
4 except:
5 print("请输入一个正确的整数")
6 print("*"*30)
7 """
8 运行结果:
9 请输入一个整数5
10 ******************************
11
12 请输入一个整数abc
13 请输入一个正确的整数
14 ******************************
15
16 """
View Code
2.2错误类型捕获
- 程序执行过程中可能会遇到不同类型的异常,需要对不同类型的异常做出不同的响应,因此需要捕获错误类型。
[En]
different types of exceptions may be encountered during program execution, and different responses need to be made for different types of exceptions, so it is necessary to catch error types.*
- 语法如下:
–
try: #尝试执行的代码 passexcept 错误类型1: #针对错误类型1,对应的处理代码 passexcept 错误类型2: #针对错误类型2,对应的处理代码 passexcept Exception as result: print("未知错误%s" % result)
- 当Python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型
- 异常演练:
- 需求:
- 提示用户输入一个整数
- 使用8除以用户输入的整数并输出
1 try:2 num = int(input("请输入一个整数,且不能为0:"))3 a = 8 / num4 print(a)5 except ValueError:6 print("请输入正确的整数")7 except ZeroDivisionError:8 print("不能输入0")
View Code
* 捕获未知错误
– 在开发时,要预判到所有可能出现的错误,还是有一定难度的
– 如果希望程序,无论出现任何错误,都不会因为Python解释器抛出异常为终止,可以在增加一个except Exception as result
+ 演示:假如没有考虑到除以0这种情况
+
1 try:
2 num = int(input("请输入一个整数,且不能为0:"))
3 a = 8 / num
4 print(a)
5 except ValueError:
6 print("请输入正确的整数")
7 except Exception as result:
8 print("未知错误%s" % result)
9 """
10 运行结果:
11 请输入一个整数,且不能为0:0
12 未知错误division by zero
13 """
View Code
2.3异常捕获完整语法
- 在实际开发中,为了处理复杂的异常情况,完整的异常语法如下:
[En]
in actual development, in order to handle complex exception cases, the complete exception syntax is as follows:*
–
try: #尝试执行的代码 passexcept 错误类型1: #针对错误类型1,对应的处理代码 passexcept 错误类型2: #针对错误类型2,对应的处理代码 passexcept (错误类型3,错误类型4): #针对 错误类型3 和 错误类型4 对应的处理代码 passexcept Exception as result: print("未知错误%s" % result)else: #没有异常才会执行的代码 passfinally: #无论是否有异常,都会执行的代码 print("无论是否有异常,都会执行的代码")
- else 只有在没有异常时,才会执行的代码
- finally 无论是否有异常,都会执行的代码
3.异常的传递
- 异常的传递——当函数/方法执行出现异常,会将异常传递给 函数/方法的 调用一方
- 如果 传递到主程序 任然 没有异常处理,程序才会被终止
–
1 #异常的传递性 2 def fun1(): 3 return int(input("请输入一个整数")) 4 5 def fun2(): 6 fun1() 7 8 fun2() 910 """11 请输入一个整数a12 Traceback (most recent call last):13 File "D:\python_DM\venv\jiaoxue\异常\异常.py", line 8, in14 fun2()15 File "D:\python_DM\venv\jiaoxue\异常\异常.py", line 6, in fun216 fun1()17 File "D:\python_DM\venv\jiaoxue\异常\异常.py", line 3, in fun118 return int(input("请输入一个整数"))19 ValueError: invalid literal for int() with base 10: 'a'20 传递顺序:3 - > 6 --> 82122 """
- 提示:
- 在开发中,可以在主函数中增加 异常捕获
- 而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中
- 这样就不需要在代码中增加大量的 异常捕获,能够保证代码的整洁
- 代码演示:
+
def fun1(): return int(input("请输入一个整数"))def fun2(): fun1()try: fun2()except Exception as result: print("未知错误%s"%result)"""运行结果:请输入一个整数a未知错误invalid literal for int() with base 10: 'a'"""
4.抛出raise异常
4.1应用场景
- 在开发中,除了 代码执行错误 Python 解释器 抛出异常之外
- 还可以根据 应用程序 特有的业务需求 主动抛出异常
示例:
- 提示用户 输入密码,如果 长度少于8,抛出异常
4.2抛出异常
- Python中提供一个Exception异常类
- 在开发过程中,如果您想在满足特定业务需求时抛出异常,您可以:
[En]
during development, if you want to throw an exception when meeting specific business requirements, you can:*
- 创建 Exception 的对象
- 使用 raise关键字 抛出异常
- 需求:
- 定义一个input_password函数,提示用户输入密码
- 如果用户输入的密码长度
1 #抛出异常 2 def input_password(): 3 #提示用户输入密码 4 pwd = input("请输入密码") 5 #判断密码长度是否>=8,如果大于返回用户输入的密码 6 if len(pwd) >= 8: 7 return pwd 8 #如果 9 #创建异常对象,可以使用错误信息字符串作为参数10 ec = Exception("密码长度不够")11 #主动抛出异常12 raise ec1314 try:15 print(input_password())16 except Exception as result:17 print(result)1819 """20 运行结果1:21 请输入密码12345622 密码长度不够2324 运行结果2:25 请输入密码12345679826 12345679827 """
抛出异常
*
-*- coding:utf8 -*-
实现判断用户输入的密码长度是否正确 a>=8
def input_password():
password = input("请输入您的密码").strip()
if len(password) >= 8:
return password
else:
raise FjfException("密码长度不够8位")
自定义判断密码长度异常
class FjfException(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return "出现了%s的异常" % self.msg
try:
input_password()
print("登录成功")
except FjfException as e:
print(e)
抛出异常代码优化
5.assert语句
assert语句又称为 断言 ,断言表示为一些逻辑表达式,程序员相信,在程序中的某个特定点该表达式值为真,如果为假,就会触发AssertionError异常。assert语句的基本语法格式如下:
assert 逻辑表达式 [,参数]
逻辑上等同于:
if not 逻辑表达式:
raise AssertionError(参数)
例如:
a = 3
assert a>5, 'a的值应该大于5'#如果a >= 6 程序就不会报错
assert语句用来收集用户定义的约束条件,而不是捕获内在的程序设计错误。
Original: https://www.cnblogs.com/fjfsu/p/15468013.html
Author: J.FengS
Title: Python异常
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/510958/
转载文章受原作者版权保护。转载请注明原作者出处!