前言
在编程的世界中,我们常常会面对各种各样的错误和异常情况。尤其当我们使用Python这样的高级编程语言时,理解和处理异常变得至关重要。毕竟,光鲜的代码往往只是表象,而异常处理才是程序稳定性和可靠性的关键所在。
本博客将带你深入了解Python异常处理的重要性,并教你如何优雅地应对各种异常情况。
什么是异常
在 python 中,异常大致有两种情况:
一种是当我们写代码的时候就会提示的异常信息。
另外一种就是我们运行代码时出现的异常。
类似于这种报错信息就被称为异常,那么今天我将为大家着重讲解在代码运行之后出现的异常。
捕获异常
基本语法
当我们程序运行起来的时候,如果出现异常并且这个异常并没有被我们程序员解决的话,那么这个程序便会被强制终止,那么如果我们想要让程序继续执行该怎么办呢?
首先我们需要捕获到异常,在 python 中,这样捕获异常。
try: 可能会出现异常的代码 except: 如果出现异常执行的代码
前面我们学习了 python文件操作 ,我们都知道当我们以 “r” 的模式打开文件的时候,如果文件不存在,则会报错,当出现这个错误的时候,我们可以使用 “w” 的模式打开文件,如果文件不存在,则会自动创建文件。
try: f = open('test.txt','r') except: f = open('test.txt','w')
这就是因为我们的 try
捕获到了异常,然后执行 except
里面的代码,这样就避免了程序的异常终止。
捕获指定类型异常
既然要捕获到指定的异常类型,那么我们就需要知道 python 中有哪些异常类型。
在Python中,常见的异常类型如下:
- BaseException:所有异常的基类
- SystemExit:程序退出异常
- KeyboardInterrupt:用户中断异常(通常由 Ctrl+C 引发)
- Exception:大多数异常的基类
- StopIteration:迭代器没有更多的值异常
- StopAsyncIteration:异步迭代器没有更多的值异常
- ArithmeticError:数值计算异常的基类
- FloatingPointError:浮点计算异常
- OverflowError:数值运算溢出异常
- ZeroDivisionError:除数为零异常
- AssertionError:断言语句失败异常
- AttributeError:对象没有此属性异常
- BufferError:缓冲区操作异常
- EOFError:文件末尾异常
- ImportError:导入模块异常
- ModuleNotFoundError:找不到模块异常
- LookupError:索引操作异常的基类
- IndexError:索引超出序列范围异常
- KeyError:字典中找不到键异常
- MemoryError:内存溢出异常
- NameError:未声明/初始化变量异常
- UnboundLocalError:局部变量未初始化异常
- OSError:操作系统异常的基类
- FileNotFoundError:文件未找到异常
- PermissionError:权限错误异常
- TypeError:不同类型间的无效操作异常
- ValueError:传递给函数的参数无效异常
- RuntimeError:运行时异常的基类
- NotImplementedError:方法未实现异常
- RecursionError:递归调用异常
我们可以根据捕获指定类型异常。
try: print(name) except NameError: print('程序出现NameError异常')
但是如果没有捕获到指定类型的异常,程序还是会异常终止。
try: print(name) except IndexError: print('程序出现NameError异常')
捕获多个指定类型的异常
在 python 中可以捕获到多种类型的异常,模式跟捕获指定类型的异常类似,只是多种异常类型需要以元组的形式出现。
try: 可能会出现异常的代码 except (异常类型1,异常类型2...): 如果出现异常执行的代码
try: print(name) except (IndexError,NameError): print('程序出现IndexError或者NameError异常')
捕获异常描述信息
当捕获到异常的时候,我们可以适当操作来知道出现了什么异常。
try: 可能会出现异常的代码 except (异常类型1,异常类型2...) as 变量: print(变量) 如果出现异常执行的代码
as 后面的变量用来接收异常信息。
try: f = open('test.txt','r') except FileNotFoundError as result: print(result) f = open('test.txt','w')
捕获所有异常
我们不可能时刻记住 python 的所有异常类型,那么有没有一种方法可以解决呢?当然可以,我们可以使用 Exception
来代表所有异常类型,因为 Exception
类是所有异常类的父类,所有异常类都继承自 Exception
类
try: 可能会出现异常的代码 except Exception: pass
array = [1,2,3,4] try: print(array[5]) except Exception as result: print(result) print('数组越界')
else
我们的异常也可搭配着 else
使用,表示如果没有出现异常执行的代码。
try: 可能会出现异常的代码 except: pass else: 如果没有出现异常执行的代码
array = [1,2,3,4] try: print(array[2]) except Exception as result: print(result) print('数组越界') else: print('恭喜你,程序没有出现异常')
finally
finally
表示不管你出现还是没有出现异常都会执行的代码,通常用来关闭资源,防止造成资源的浪费。
try: 可能出现异常的代码 except: pass finally: 关闭资源
try: f = open('test.txt','r') except Exception as result: print(result) f = open('test.txt','w') finally: print('关闭文件') f.close()
异常的嵌套
我们需要读取文件中的内容,那么首先我们需要判断是否打开成功,如果打开成功,则还需要在读取内容的过程中判断时候出现错误。
try: 可能会出现异常的代码 try: 可能会出现异常的代码 except: pass finally: pass except: pass finally: pass
为了体现在读取文件过程中出现异常,我们在 cmd
命令行中使用 CTRL+C
来停止读取数据。并且我们需要搭配着 time
模块下的 sleep
方法来使程序执行速度放慢。
import time try: f = open('test.txt','r') try: while True: con = f.readline() if len(con) == 0: break time.sleep(3) print(con) except: print('程序因异常停止读取数据') finally: print('关闭文件') f.close() except: print('文件不存在')
这里为什么没有执行 print('文件不存在')
这行代码呢?因为外面的 try
捕获的是
f = open('test.txt','r')
这行代码,这行代码属于正常执行的,并没有出现异常,所以不会执行外层的 except
里面的代码。
自定义异常
在日常生活中,python 为我们提供的异常类型是不能满足生活中的需求的,所以在 python 中我们可以自定义异常,来满足我们的需求。
需要注意的是:我们自定义的异常类需要继承自 Exception
类,并且使用
raise 自定义异常类
来抛出异常。
# 1.自定义异常类 class 自定义异常类(Exception): 代码 # 设置抛出异常的描述信息 def __str__(self): return # 2.抛出异常 raise 自定义异常类() # 3.捕获异常 except Exceptiopn...:
异常类里面通常需要有 __ init __
和 __ str __
等其他方法来使我们的自定义异常类使用起来更加的方便。
class PasswordError(Exception): def __init__(self,input): self.input = input def __str__(self): return f'你输入的密码{self.input}与正确密码不符' def login(): password = '987654' while True: try: input_password = input('请输入密码:') if password != input_password: raise PasswordError(input_password) except Exception as result: print(result) else: print('登录成功') break login()
结语
感谢大家的观看,如果文章有错误,欢迎大家指出!🌹如果你正在学 python 的话,欢迎大家订阅我的 python 学习专栏