Python错误处理和异常(必要的攻略)

目录

1. 错误类型

2. 异常(Exceptions)

2.1 try和except 块

2.2 捕获特定类型的异常

2.3 多个 except 块

2.4 else 和 finally 语句

3. 抛出异常

3.1 自定义异常

4. 异常处理的最佳实践

结语


在学Python以来,你敲的代码已经有很多了,有时候你会发现,程序执行过程中可能会遇到的各种问题或情况,遇到各种bug。每当这个时候,这就会查看报错的信息,这时候就会发生两种情况:错误、异常

两种类型如下表:

类型描述示例

错误

(Error)

程序在运行期间遇到的严重问题,导致程序无法继续执行。一旦出现错误,程序立即停止执行并抛出错误信息。语法错误:代码中存在语法错误,如拼写错误或不正确的语法结构。
类型错误:操作或函数应用于不适当类型的数据。
逻辑错误:程序在逻辑上不符合预期,导致意外行为或结果。

异常

Exceptions

一种更加可控和处理的情况,当程序遇到意外或不正常的情况时会引发异常。这些异常可以被程序捕获并进行适当的处理。IndexError:尝试访问列表中不存在的索引位置。
FileNotFoundError:试图打开不存在的文件。
ZeroDivisionError:除数为0的情况。

对于这两种报错信息的处理也需要不同的方式。

首先是错误,这一类报错,往往是语法的问题,比如说当你写print()的时候,写错了:

对于这类错误,下面会讲,但是解决的办法就是,你需要仔细!!!!

其次就是异常,这类错误,你需要学习今天的教程:

1. 错误类型

Python提供了许多内置的报错的异常类型,每种类型对应不同的错误情况。以下是一些常见的内置异常类型,以及它们的含义和常见原因:

  • SyntaxError(语法错误)
    • 含义:当Python代码的语法有误时引发。
    • 常见原因:拼写错误、缺少冒号、缩进错误等。
# 示例 SyntaxError
print "Hello, World!"
  • IndentationError(缩进错误)
    • 含义:当代码的缩进格式不正确时引发。
    • 常见原因:在代码块中混合使用了制表符和空格、缩进不一致等。
# 示例 IndentationError
def my_function():
print("Indentation Error")
  • NameError(名称错误)
    • 含义:当使用一个未定义的变量或函数时引发。
    • 常见原因:拼写错误、变量/函数未声明就被使用等。
# 示例 NameError
print(my_variable)
  • TypeError(类型错误)
    • 含义:当操作或函数应用于不适当类型的对象时引发。
    • 常见原因:尝试对不同类型的对象执行不兼容的操作、传递错误类型的参数等。
# 示例 TypeError
num = 10
print("Number: " + num)  # 试图将整数和字符串连接
  • ZeroDivisionError(除零错误)
    • 含义:当尝试除以零时引发。
    • 常见原因:明确或意外地尝试除以0。
# 示例 ZeroDivisionError
result = 10 / 0
  • FileNotFoundError(文件未找到错误)
    • 含义:当试图打开不存在的文件时引发。
    • 常见原因:文件路径错误、文件被移动或删除等。
# 示例 FileNotFoundError
with open("non_existent_file.txt", "r") as file:
    content = file.read()
  • ValueError(值错误)
    • 含义:当函数接收到一个正确类型但不适合的值时引发。
    • 常见原因:传递给函数的参数值超出了预期的范围或不符合函数的要求。
# 示例 ValueError
int("abc")   # 试图将无法转换为整数的字符串转换为整数

以上只是一些常见的内置异常类型示例。这些错误类型,都会在控制台进行输出。

2. 异常(Exceptions)

与错误不同,异常是一种更加可控和处理的情况。当程序遇到意外或不正常的情况时,会引发异常。这些异常可以被程序捕获(catch)并进行适当的处理,使程序能够继续执行。

在Python中,提供了一种叫做“assert(断言)”的方式,来判断一个表达式,在表达式条件为 false 的时候触发异常。

下面讲解异常处理办法:

2.1 tryexcept 块

使用 try/except 语句来进行错误处理,语法如下:

try:
    # 可能会引发异常的代码块
    # 这里放置你希望捕获异常的代码
except Exception:
    # 发生异常时的处理代码
    # 在这里你可以处理异常,或者进行其他操作

结构如如下:

try 子句中的代码块会被尝试执行。如果执行过程中发生异常,则会跳到 except 子句执行。

except 子句可以指定要处理的异常类型。如果异常类型与 except 子句指定的类型匹配,则会执行该子句中的代码块。

示例代码:

try:
    x = 1 / 0
except ZeroDivisionError as e:
    print("发生了零除错误:", e)

# 输出:发生了零除错误: division by zero

2.2 捕获特定类型的异常

有时候,你可能只想捕获某系个特定类型的异常,以便更精确地处理这些异常。这时,可以通过指定 except 后面的异常类型来实现。

try:
    # 可能会引发异常的代码块
except SpecificExceptionType:
    # 处理特定类型的异常
except AnotherSpecificExceptionType:
    # 处理另一种特定类型的异常
except (Type1, Type2):
    # 处理多种类型的异常
except Exception:
    # 处理所有其他类型的异常
  • 你可以列出一个或多个 except 块,每个 except 块指定要处理的特定异常类型。
  • 如果发生的异常类型与 except 块中指定的类型匹配,Python 将执行该 except 块中的代码。
  • 如果没有匹配的 except 块,那么异常将继续向上层传播。

示例代码:

# 捕获 ZeroDivisionError 以处理除零错误
try:
    x = 10 / 0  # 尝试进行除以零的操作
except ZeroDivisionError:
    print("除以零错误发生了!")
except ArithmeticError:
    print("数学错误发生了!")
第一个  except ZeroDivisionError 块处理除以零错误。
第二个  except ArithmeticError 块是为了捕获更一般的算术错误,但它并不会捕获除以零错误,因为  ZeroDivisionError 是  ArithmeticError 的子类。

2.3 多个 except 块

有时候,具体的异常类型需要编写不同的处理逻辑,那就可以采用多个 except 块来处理不同类型的异常。

语法如下,按顺序列出 except 块以处理特定的异常情况:

try:
    # 可能会引发异常的代码块
except SpecificExceptionType1:
    # 处理特定类型1的异常
except SpecificExceptionType2:
    # 处理特定类型2的异常
except AnotherExceptionType:
    # 处理另一种异常类型
except Exception:
    # 处理所有其他类型的异常

在这个结构中:当一个 except 块处理了一个异常后,程序将不再继续尝试匹配后续的 except 块。因此,应该按照希望处理的特定异常的顺序列出 except 块。

示例代码:

try:
    x = int(input("请输入一个整数: "))
    result = 10 / x
except ValueError:
    print("输入的不是一个有效的整数!")
except ZeroDivisionError:
    print("除以零错误发生了!")
except Exception:
    print("发生了其他类型的异常!")

上面的代码中:

  • 如果用户输入的不是一个整数,那么 ValueError 异常将被捕获并处理。
  • 如果用户输入的是零,那么 ZeroDivisionError 异常将被捕获并处理。
  • 如果用户输入的是一个非零整数,那么不会引发异常,程序将继续执行。

2.4 else 和 finally 语句

else 语句:当没有异常发生时执行的代码块,else 语句用于指定在 try 块中没有发生任何异常时要执行的代码。通常用于处理只在没有异常时才应该执行的操作。

语法如下:

try:
    # 可能会引发异常的代码块
except ExceptionType1:
    # 处理特定类型1的异常
except ExceptionType2:
    # 处理特定类型2的异常
else:
    # 没有异常时要执行的代码

结构示意图:

示例代码:

try:
    x = int(input("请输入一个整数: "))
except ValueError:
    print("输入的不是一个有效的整数!")
else:
    print("您输入的是一个整数。")

代码解释:如果用户输入的是一个整数,else 语句将会执行,打印出 "您输入的是一个整数。

如果用户输入的不是一个整数,ValueError 异常将被捕获并处理。

  • finally 语句:无论是否发生异常都会执行的清理代码块

finally 语句用于指定在 try 块结束时必须执行的代码,无论是否发生了异常。这个代码块通常用于执行清理操作,比如上一篇文章中,我们讲到关闭文件或数据库连接等。

语法如下:

try:
    # 可能会引发异常的代码块
except ExceptionType1:
    # 处理特定类型1的异常
except ExceptionType2:
    # 处理特定类型2的异常
finally:
    # 无论是否发生异常都要执行的代码

结构示意图:

示例代码:

try:
    f = open("example.txt", "r")
    # 读取文件内容等操作
except FileNotFoundError:
    print("文件未找到!")
finally:
    f.close()  # 确保文件在最终结束时被关闭

代码解释:不管是否发生 FileNotFoundError 异常,finally 块中的 f.close() 语句都会确保打开的文件被关闭。

那么i前面讲了 else和finally,一句话概括就是:else 语句用于处理没有引发异常时的代码,而 finally 语句用于确保一些操作(如资源清理)无论是否发生异常都会执行。

3. 抛出异常

在编程的时候,有些特殊请款,比如,某些情况下应该引发异常,那么,你可以使用 raise 语句来主动抛出异常。

比如说,某函数要检查传入的参数 x 是否为负数。如果是负数,它将抛出一个 ValueError 异常,并显示一个错误消息。那么你就可以这么写:

def some_function(x):
    if x < 0:
        raise ValueError("x 不能是负数")
    # 其他代码

# 调用函数并传入负数
try:
    some_function(-5)
except ValueError as e:
    print(e)

3.1 自定义异常

你也可以定义自己的异常类,这样可以更好地找到和标识不同类型的错误。

class CustomError(Exception):
    def __init__(self, message):
        self.message = message

    def __str__(self):
        return f"CustomError: {self.message}"

def some_function(x):
    if x < 0:
        raise CustomError("x 不能是负数")
    # 其他代码

# 调用函数并传入负数
try:
    some_function(-5)
except CustomError as e:
    print(e)

上面的例子中,CustomError 是一个继承自 Exception 的自定义异常类。它有一个 message 属性来存储错误消息,并重写了 __str__ 方法以便打印有意义的错误信息。

4. 异常处理的最佳实践

现在我们来通过几个例子讲讲异常的最佳实践案例。

实践类型说明
记录异常信息在捕获异常时,最好记录异常的详细信息,以便后续调试和分析。
避免捕获所有异常尽量避免使用裸露的 except 语句,因为它会捕获所有异常,包括你可能没有预料到的异常。这会隐藏程序中的潜在错误。
在适当的时候引发异常当检测到某些情况不符合预期时,应该使用 raise 引发异常,以便让调用者或上层代码知道发生了什么问题。
处理特定异常使用多个 except 块来处理不同类型的异常,使得代码更具可读性和可维护性。
使用 else 和 finallyelse 用于处理没有异常时的情况,finally 用于确保清理操作得到执行。

示例 1:记录异常信息

import logging

try:
    result = 10 / 0
except ZeroDivisionError as e:
    logging.error(f"发生除零错误:{e}")

示例 2:避免捕获所有异常

try:
    # 可能会引发异常的代码
except SpecificException:
    # 处理特定异常
except AnotherSpecificException:
    # 处理另一种特定异常
except Exception as e:
    logging.error(f"发生异常:{e}")

示例 3:引发异常

def calculate_age(age):
    if age < 0:
        raise ValueError("年龄不能是负数")
    # 其他代码

try:
    calculate_age(-5)
except ValueError as e:
    logging.error(f"发生值错误:{e}")

示例 4:使用 else 和 finally

try:
    f = open("example.txt", "r")
    # 读取文件等操作
except FileNotFoundError as e:
    logging.error(f"文件未找到:{e}")
else:
    print("文件读取成功!")
finally:
    f.close()

结语

在 Python 中,想要你的代码可靠、健壮代。良好的异常处理必不可少。如果你敏感一点,你就会发现存在错误和异常处理的代码更容易阅读、调试和维护。只需要通过使用 tryexceptraise、自定义异常等操作。你就可以很好地控制程序的行为,使代码在面对各种情况时表现更加稳健和可靠。

如果大家跟着我的代码一起学习,相信你一定会有所收获。我们下一篇文章仍然会继续Python高阶特性的讲解,欢迎大家和我一起继续学习、记录python的下一个知识点。

如果感觉阅读对您还有些作用,可以评论留言,关注我。谢谢您的阅读!

往期学习:

Python安装教程(版本3.8.10)windows10

Linux系统:安装Conda(miniconda)

Conda快速安装的解决方法(Mamba安装)

VSCode安装教程(版本:1.87.0)Windows10

Python基础语法:从入门到精通的必备指南

Python的基本数据类型

Python数据类型间的转换(隐式、显式)-CSDN博客

Python基础知识:运算符详解-CSDN博客

Python基础知识:数字类型及数学函数详解-CSDN博客

Python字符串操作及方法详解!一篇就搞定!-CSDN博客

Python列表及其操作详解,从此不再迷茫!-CSDN博客

Python元组(Tuple)深度解析!

Python字典的使用技巧(一篇详解)

Python条件控制深度解析,成为编程必备

Python循环语句全解析(附实战演练)

Python函数高效编程技巧,提升你的代码效率!

Python模块和包全解析,一篇文章就够!

Python新手必学:输入输出全攻略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/459989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis如何保证缓存一致性

方式一&#xff1a;先更新数据库&#xff0c;再更新缓存场景 当有两个线程A、B&#xff0c;同时对一条数据进行操作&#xff0c;一开始数据库和redis的数据都为tony&#xff0c;当线程A去修改数据库&#xff0c;将tong改为allen&#xff0c;然后线程A在修改缓存中的数据&#x…

Fiddler抓包工具——学习笔记

F12抓包 302【重定向】&#xff1a;当你发送了一个请求之后&#xff0c;那么这个请求重定向到了另外的资源 跳转和重定向的区别&#xff1a; 跳转是会把数据传到新的地址 重定向不会把新的数据传到新的地址 使用F12抓包时一定要打开Preserve Log开关&#xff0c;作用是保留…

4核8G服务器性能如何?4核8G12M服务器能承受多少人访问?

腾讯云轻量4核8G12M服务器配置446元一年&#xff0c;646元12个月&#xff0c;腾讯云轻量应用服务器具有100%CPU性能&#xff0c;系统盘为180GB SSD盘&#xff0c;12M带宽下载速度1536KB/秒&#xff0c;月流量2000GB&#xff0c;折合每天66.6GB流量&#xff0c;超出月流量包的流…

KKView远程控制: todesk内网穿透

Todesk内网穿透&#xff1a;实现远程访问的新途径 在数字化时代&#xff0c;远程访问已成为许多企业和个人的基本需求。Todesk作为一款远程桌面控制软件&#xff0c;其内网穿透功能为用户提供了便捷、安全的远程访问体验。本文将介绍Todesk内网穿透的原理、应用场景及其优势&a…

python 基础知识点(蓝桥杯python科目个人复习计划64)

今日复习内容&#xff1a;做题 例题1&#xff1a;蓝桥课程抢购 问题描述&#xff1a; 为了能让更多的同学学到IT技术&#xff0c;蓝桥云课又开始了课程限时打折活动。 作为初学者的你&#xff0c;希望尽可能买到含金量总额更高的课程&#xff0c;当然其他同学也是这么想。 …

健康消费需求持续上涨,品牌如何抓住机遇

近年来&#xff0c;国内“大健康”时代徐徐展开&#xff0c;居民消费热度不断攀升&#xff0c;主动健康消费已经成为新的增长点&#xff0c;然而健康行业的内容由于专业性较高&#xff0c;传播范围有限导致无法直接触达用户。在当下的传播环境中&#xff0c;品牌应该如何抓住机…

HPA数据库及HPAanalyze包使用

关于HPA数据库的介绍&#xff1a;Human Protein Atlas 数据库 – 王进的个人网站 (jingege.wang) The Human Protein Atlas 文献 HPAanalyze: an R package that facilitates the retrieval and analysis of the Human Protein Atlas data | BMC Bioinformatics | Full Text …

H5 流光分割个人主页源码

源码名称&#xff1a;流光分割个人主页源码 源码介绍&#xff1a;一款流光分割特效个人主页源码&#xff0c;源码带大量跳转个人联系方式按钮和朋友按钮。同时带有个人介绍。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10241.html

LeetCode每日一题 将有序数组转换为二叉搜索树(分治)

题目描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视…

林木园区改造VR仿真培训课件提高人们的专业素质

森林经营VR模拟体验摆脱了传统森林经营周期长、实践难及耗材大等问题&#xff0c;借助VR虚拟仿真技术为人们提供一种全新的、沉浸式的森林经营体验&#xff0c;让人们更好地了解森林经营的全周期。 提高人们的环保意识 通过亲身参与森林经营的过程&#xff0c;人们可以更直观地…

mysql: 如何开启慢查询日志?

1 确认慢查询日志功能已开启 执行以下sql语句&#xff0c;查看慢查询功能是否开启&#xff1a; show VARIABLES like slow_query_log;如果为ON&#xff0c;表示打开&#xff1b;如果为OFF&#xff0c;表示没有打开&#xff0c;需要开启慢查询功能。 执行以下sql语句&#xff0…

【MATLAB源码-第163期】基于matlab的BPSK+瑞利(rayleigh)信道下有无波束成形误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;波束成形&#xff08;Beamforming&#xff09;技术是一种广泛使用的信号处理技术&#xff0c;通过调整天线阵列中各个元素的相位和幅度&#xff0c;使得信号在特定方向上增强&#xff0c;在其他方向…

CC连接过程

1、CC线连接过程 DFP和UFP会实时监控CC1和CC2引脚的电压&#xff0c;来评估DFP和UFP是否都已经在位。同时DFP可以根据电压确定自己所能提供的电流的大小 2、连接过程 Source端使用一个MOS管去控制Vbus&#xff0c;初始状态下&#xff0c;FET为关闭状态&#xff0c;Vbus不通。S…

Transformer的前世今生 day01(预训练

预训练 在相似任务中&#xff0c;由于神经网络模型的浅层是通用的&#xff0c;如下图&#xff1a; 所以当我们的数据集不够大&#xff0c;不能产生性能良好的模型时&#xff0c;可以尝试让模型B在用模型A的浅层基础上&#xff0c;深层的部分自己生成参数&#xff0c;减小数据集…

SQL面试学习 行列转换

行列转换 多行转多列 concat_ws&#xff1a;把集合中的值用指定分隔符连接 collect_set&#xff08;&#xff09;&#xff1a;收集唯一值并返回一个集合 SQL字符串拼接函数concat()、collect_set()、collect_list()和concat_ws()用法 cast&#xff08;&#xff09;将任何类型…

微信小程序开发学习笔记《21》uni-app框架-楼层图片跳转

微信小程序开发学习笔记《21》uni-app框架-楼层图片跳转 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、创建新的分包goods_list 二、将请求到的楼层数据url调整为本地的 可以看到上图是请求…

14 stack和queue的使用

stack的介绍 stack文档 1.stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入和提取操作 2.stack是作为容器适配器被实现的&#xff0c;容器适配器是对特定类封装作为其底层的容器&#xff0c;并提供…

使用 Docker Compose 快速搭建监控网站 uptime-kuma

有时候需要监控自己搭建的一些网站、服务是否正常运行&#xff0c; 这时候可以考虑使用一个监控网站&#xff0c; 定时的进行检测&#xff0c; 记录网站、服务的运行状态&#xff0c; 在这推荐使用 uptime-kuma。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539…

计算机毕业设计-基于大数据分析的服装定制网的设计与实现

概要 人民的日常生活离不开“衣食住行”&#xff0c;四者之中“食住行”发展迅猛&#xff0c;突飞猛进的发展推动了产业的升级更新。而与之形成鲜明对比的是&#xff0c;服装行业作为传统古老的行业&#xff0c;因为产业结构特征、个性化需求等问题&#xff0c;难以出现推动行业…

支小蜜AI校园防欺凌系统可以使用在宿舍吗?

随着人工智能技术的快速发展&#xff0c;AI校园防欺凌系统已成为维护校园安全的重要手段。然而&#xff0c;关于这一系统是否适用于宿舍环境&#xff0c;仍存在一些争议和讨论。本文将探讨AI校园防欺凌系统在宿舍中的适用性&#xff0c;分析其潜在的优势与挑战&#xff0c;并提…