Python异常处理

小序

天道酬勤,小憩更佳
平常心看待,一草一木皆是风景

目录

  • 小序
  • 正文
    • 异常
    • 异常类
    • 异常处理
    • 抛出异常
    • 自定义异常
    • 总结
  • 结束语

正文

异常

在Python中,程序在执行的过程中产生的错误称为异常,比如列表索引越界、打开不存在的文件等。

看下面这个例子
Python异常处理_第1张图片
显然,a 之前并未声明使用过,123.txt 文件也是未创建的
报错如下
在这里插入图片描述
这便是出现了异常情况
具体的异常分类如下

异常类

异常类主要是下面几类

  1. NameError
    尝试访问一个未声明的变量,会引发NameError
  2. ZeroDivisionError
    当除数为零的时候,会引发ZeroDivisionError异常
  3. SyntaxError
    当解释器发现语法错误时,会引发SyntaxError异常
  4. IndexError
    当使用序列中不存在的索引时,会引发IndexError异常
  5. KeyError
    当使用映射中不存在的键时,会引发KeyError异常
  6. FileNotFoundError
    试图打开不存在的文件时,会引发FileNotFoundError
  7. AttributeError
    当尝试访问未知对象属性时,会引发AttributeError异常

下面就看看如何去解决这些异常

异常处理

try-except 语句定义了监控异常的一段代码,并提供了处理异常的机制

try# 语句块
except# 异常处理代码

Python异常处理_第2张图片
处理多个异常 的try-except语句格式如下:

try# 语句块
except 异常名称1# 异常处理代码1
except异常名称2# 异常处理代码

Python异常处理_第3张图片
当出现多种异常时,为了区分不同的错误信息,可以使用as获取系统反馈的信息

# 获取描述信息
except (ZeroDivisionError, ValueError) as result:
    print("捕捉到异常:%s"%result)

当程序中出现大量异常时,捕获这些异常是非常麻烦的。
这时,我们可以在except子句中不指明异常的类型,这样,不管发生何种类型的异常,都会执行except里面的处理代码.

如果try语句没有捕获到任何的错误信息,就不再执行任何except语句,而是会执行else语句。
Python异常处理_第4张图片
eg 1.

def get_score():
    try:
		score = int(input('输入成绩: '))
    except ValueError:        
    	return 0    
    return score
score = get_score()
print('学生的成绩是:', score)

eg 2.

def get_score():
    score = int(input('输入成绩: '))
    if score in range(101):
    	return score    
    else:        
    	return 0
try:    
	score = get_score()
    print('学生的成绩是:', score)
except ValueError:    
	score = 0
	print('学生的成绩是:', score)

终止行为(finally)

在程序中,无论是否捕捉到异常,都必须要执行某件事情,例如关闭文件、释放锁等,这时可以提供finally语句处理。通常情况下,finally用于释放资源。

抛出异常

raise 语句

使用raise语句能显示地触发异常,格式如下

Python异常处理_第5张图片

  1. 使用类名引发异常
    当raise语句指定异常的类名时,会创建该类的实例对象,然后引发异常
    Python异常处理_第6张图片
  2. 使用异常类的实例引发异常
    Python异常处理_第7张图片
  3. 传递异常
    不带任何参数的raise语句,可以再次引发刚刚发生过的异常
    作用就是向外传递异常
    Python异常处理_第8张图片
  4. 指定异常的描述信息Python异常处理_第9张图片
  5. 异常引发异常
    使用raise…from…可以在异常中抛出另外的异常
try:
   num
except Exception as exception:
   raise IndexError("下标超出范围") from exception

try 里面只定义了变量 num,会引发 NameError异常。
except子句使用 raise…from… 抛出NameError异常后再抛出“下标越界”的异常

eg 3.

def get_age():
    age = int(input('请输入年龄(1-140):'))    
    if age in range(1, 141):        
    	return age    
    raise ValueError  # 故意抛出异常
while True:
    try:        
    	age = get_age()        
    	print('用户输入的年龄是:', age)    
    except ValueError:  # 接收抛出的异常        
    	print('用户输入的年龄不在1-140之间,获取年龄失败!')

自定义异常

创建一个继承Exception类的子类,就是自定义异常类。

当遇到自己设定的错误时,使用raise语句抛出自定义的异常

总结

总的来说,Python的异常处理相对来说较为简单,应用也极易上手
但是它发挥的功能却是不可忽视的
在程序运行的过程中,难免会出现千奇百怪的错误
如何全面的考虑到错误,合理地使用异常处理
能够避免出现一些运行的bug

本篇文章围绕着Python的异常进行介绍,
包括异常类、抛出和捕捉系统内置的异常、抛出和捕捉自定义异常。
读者应了解异常的产生和原理,灵活使用异常处理
其效果往往是绝佳的

结束语

美好的一天开始啦!

你可能感兴趣的:(Python,python)