当前位置:   article > 正文

韩顺平 | 零基础快速学Python(15) 错误和异常

韩顺平 | 零基础快速学Python(15) 错误和异常

概述

Python有两种不同的错误:语法错误和异常。
语法错误SyntaxError/句法错误/解析错误:执行前编译器检测到的错误。语法错误也是一种异常,SyntaxError继承Exception。
异常Exception:执行时检测到的错误。

需求:出异常会直接导致程序崩溃/结束,需要一种机制可以对异常进行处理,让程序出现异常时可以继续执行,引出异常和异常处理机制。

解决方案:捕获异常,保证程序可以继续执行。

try:
	num1 = 10
	num2 = 0
	res = num1 / num2
except Exception as e:
	print(f"捕获异常{e}")
print("程序继续执行")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

内置异常

异常层级关系

基类异常:BaseExceptionException
具体异常

常见异常

IndexError:索引越界
KeyError:现有键集合中找不到指定的隐射(字典)键时被引发
NameError:当某个局部或全局名称未找到时将被引发,如使用没有定义的变量名
TypeError:当一个操作或函数使用了类型不适当的对象时被引发
ValueError:当操作或函数接收到具有正确类型但值不适合参数时被引发

print(int("123"))
print(int("hello")) # ValueError
  • 1
  • 2

ZeroDivisionError:当除法或取余运算的第二个参数为零时将被引发
FileNotFoundError:请求的文件或目录不存在
AttributeError:属性引用或赋值失败

class A:
	def hi(self):
		pass
a = A()
print(a.name)
  • 1
  • 2
  • 3
  • 4
  • 5

异常处理

捕获异常

try:
	可能出现异常的代码
except [异常 as 别名]: # 将捕获的异常类型用别名接收
	发生异常时,对异常处理的代码 # 程序员可以通过别名获取异常的具体信息
[else:]
	没有发生异常时,执行的代码
[finally:] # 如关闭连接、释放资源相关代码
	不管有没有异常,都要执行的代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以有多个except语句,捕获不同的异常(进行不同的业务处理),如果发生异常,只会匹配一个except,建议把具体的异常写在前面,基类异常在后,当具体异常匹配不到时,会由基类异常进行匹配。一个except子句,也可以捕获不同的异常。

except (IndexError, ZeroDivisionError) as e:
	print(f"出现了异常信息{e} 类型{type(e)}")
except Exception as e:
	print(f"出现了异常Exception 异常信息->{e}")
  • 1
  • 2
  • 3
  • 4

主动触发异常/抛出异常

raise语句支持强制触发指定的异常

try:
	raise ZeroDivisionError("主动触发ZeroDivisionError异常")
except ZeroDivisionError as e:
	print(f"出现了异常ZeroDivisionError 异常信息->{e}")
  • 1
  • 2
  • 3
  • 4

异常传递

介绍:如果异常发生,但没有捕获处理异常,该异常会传递给调用者处理。如果所有的调用者都没有处理,最终会由系统处理。

def f2():
	print(10/0)
	
def f1():
	try:
		f2()
	except Exception as e:
		print(f"f1()捕获异常{e}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

自定义异常

程序可以通过创建新的异常类命名自己的异常,无论直接还是简洁的方式,异常都应从Exception类派生

异常类通常应当保持简单,它往往只提供一些属性,允许相应的异常处理程序提取有关错误的信息。
大多异常命名都以Error结尾,类似标准异常命名,不要使用内置异常名

class AgeError(Exception):
	pass # Exception有构造器传入参数

while True:
	try:
	 age = int(input("请输入年龄(18-120):"))
	 if not (18<=age<=120):
	 	raise AgeError("年龄需要在18-120之间")
	 break # 正确的值不会抛出异常,会执行到该语句,否则继续执行while循环
	except ValueError as e:
	 	print("你输入的不是整数")
	except AgeError as e:
	 	print(e) #输出传参信息 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/626782
推荐阅读
相关标签
  

闽ICP备14008679号