探索Python异常:让程序不再崩溃!

简介: 探索Python异常:让程序不再崩溃!

前言

在编程的世界中,我们常常会面对各种各样的错误和异常情况。尤其当我们使用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中,常见的异常类型如下:

  1. BaseException:所有异常的基类
  2. SystemExit:程序退出异常
  3. KeyboardInterrupt:用户中断异常(通常由 Ctrl+C 引发)
  4. Exception:大多数异常的基类
  5. StopIteration:迭代器没有更多的值异常
  6. StopAsyncIteration:异步迭代器没有更多的值异常
  7. ArithmeticError:数值计算异常的基类
  8. FloatingPointError:浮点计算异常
  9. OverflowError:数值运算溢出异常
  10. ZeroDivisionError:除数为零异常
  11. AssertionError:断言语句失败异常
  12. AttributeError:对象没有此属性异常
  13. BufferError:缓冲区操作异常
  14. EOFError:文件末尾异常
  15. ImportError:导入模块异常
  16. ModuleNotFoundError:找不到模块异常
  17. LookupError:索引操作异常的基类
  18. IndexError:索引超出序列范围异常
  19. KeyError:字典中找不到键异常
  20. MemoryError:内存溢出异常
  21. NameError:未声明/初始化变量异常
  22. UnboundLocalError:局部变量未初始化异常
  23. OSError:操作系统异常的基类
  24. FileNotFoundError:文件未找到异常
  25. PermissionError:权限错误异常
  26. TypeError:不同类型间的无效操作异常
  27. ValueError:传递给函数的参数无效异常
  28. RuntimeError:运行时异常的基类
  29. NotImplementedError:方法未实现异常
  30. 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 学习专栏



相关文章
|
3月前
|
人工智能 Linux 开发工具
Python从零到一:手把手带你写出第一个实用程序
Python语法简洁易懂,适合编程新手入门。它广泛应用于人工智能、自动化办公、Web开发等领域。学习Python可快速搭建项目,拥有丰富库支持和强大社区资源。通过本教程,你将掌握基础语法、环境搭建、程序逻辑控制及实战项目开发,开启编程之旅。
378 0
|
8月前
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
1008 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
2月前
|
设计模式 决策智能 Python
Python条件控制:让程序学会"思考"的魔法
本文深入浅出地讲解Python条件控制,从基础if语句到多分支、嵌套结构,再到简洁的三元表达式与Python 3.10新增的match-case模式匹配,结合电商折扣、会员等级、ATM系统等实战案例,全面掌握程序“智能决策”的核心逻辑。
399 0
|
6月前
|
人工智能 并行计算 开发者
CUDA重大更新:原生Python可直接编写高性能GPU程序
NVIDIA在2025年GTC大会上宣布CUDA并行计算平台正式支持原生Python编程,消除了Python开发者进入GPU加速领域的技术壁垒。这一突破通过重新设计CUDA开发模型,引入CUDA Core、cuPyNumeric、NVMath Python等核心组件,实现了Python与GPU加速的深度集成。开发者可直接用Python语法进行高性能并行计算,显著降低门槛,扩展CUDA生态,推动人工智能、科学计算等领域创新。此更新标志着CUDA向更包容的语言生态系统转型,未来还将支持Rust、Julia等语言。
494 3
CUDA重大更新:原生Python可直接编写高性能GPU程序
|
5月前
|
PyTorch 算法框架/工具 C++
人工智能算法python程序运行环境安装步骤整理
本教程详细介绍Python与AI开发环境的配置步骤,涵盖软件下载、VS2017安装、Anaconda配置、PyCharm设置及组件安装等内容,适用于Windows系统,助你快速搭建开发环境。
|
6月前
|
人工智能 C# Python
处理python异常
本文介绍了Python中的异常处理机制,并实现了一个简单的异常装饰器。通过`try/except`语句捕获异常,结合`finally`子句完成清理工作。为进一步优化代码结构,文章提出了使用装饰器处理异常的方法,避免函数中大量冗长的异常处理语句。通过类封装异常装饰器,多个函数可共享异常处理逻辑,提升代码简洁性和可维护性。总结强调了装饰器在异常处理中的优势,使代码更加优雅高效。
167 27
|
5月前
|
机器学习/深度学习 前端开发 API
python3如何使用QT编写基础的对话框程序
Qt与Python结合形成了PyQt/PySide,为桌面应用开发提供强大支持。通过简单安装PyQt5或PySide6,开发者可快速搭建跨平台GUI应用。本文从创建基础对话框入手,介绍布局管理、信号与槽机制、对话框模式及样式表美化等核心功能,并探讨模态窗口、事件驱动编程和资源打包等内容。最后,引导读者探索模型视图架构、多线程处理等进阶技术,逐步掌握用Python+Qt开发高效桌面应用的技能。
189 0
|
7月前
|
Python
如何处理python的常见异常问题
在Python语言中,python异常处理机制主要依赖try、except、else、finally和raise五个关键字。本篇文章将为大家详细讲解一下如何处理python的常见异常问题。
|
9月前
|
人工智能 Shell 开发工具
[oeasy]python065python报错怎么办_try_试着来_except_发现异常
本文介绍了Python中处理异常的基本方法,重点讲解了`try`和`except`的用法。通过一个计算苹果重量的小程序示例,展示了如何捕获用户输入错误并进行处理。主要内容包括: 1. **回顾上次内容**:简要回顾了Shell环境、Python3游乐场和Vim编辑器的使用。 2. **编写程序**:编写了一个简单的程序来计算苹果的总重量,但发现由于输入类型问题导致结果错误。 3. **调试与修正**:通过调试发现输入函数返回的是字符串类型,需要将其转换为整数类型才能正确计算。
305 32

推荐镜像

更多