【100天精通python】Day17:常见异常类型与解决,异常处理语句

   目录

一  python 的常见异常类型与解决

二  常用的异常处理语句

1 try...except语句 

2 try...except...else语句

3 try...except...finally语句

4 使用raise语句抛出异常

5 自定义异常类型

6 异常链处理


         在 Python中,异常是在程序运行时发生的错误或意外情况,导致程序无法正常继续执行的情况。Python提供了一组内置的异常类,用于表示不同类型的错误。当程序发生异常时,可以通过异常处理机制来捕获和处理这些异常,以便优雅地处理错误情况。

一  python 的常见异常类型与解决

在Python中,有许多内置的异常类型,用于表示不同的错误或异常情况。

Exception是所有内置异常的基类,在Python中所有异常类都是从Exception类继承而来的。当程序出现异常时,会抛出相应的异常对象,如果这些异常没有被处理,程序将会终止执行。

python中常见的异常类型与解决: 

1.SyntaxError: 语法错误,通常是由于代码书写错误导致的,例如拼写错误、缺少冒号等。

        解决方法:仔细检查代码,确保语法正确。

2.IndentationError: 缩进错误,通常是由于代码缩进不正确导致的。

        解决方法:检查代码缩进是否正确,建议使用4个空格作为缩进。

3.NameError: 名称错误,通常是由于使用了未定义的变量或函数名称导致的。

        解决方法:确保变量和函数名称正确定义或者在使用之前进行定义。

4.TypeError: 类型错误,通常是由于使用了错误的数据类型导致的。

        解决方法:确认数据类型是否匹配,如果不匹配,可以尝试进行类型转换或者使用正确的数据类型。

5.ValueError: 值错误,通常是由于使用了不合法的值导致的。

        解决方法:确认数据的取值范围是否正确,确保使用合法的值。

6.ZeroDivisionError: 除以零错误,通常是由于除法运算中除数为零导致的。

        解决方法:确保除数不为零,可以在除数为零的情况下进行异常处理,避免程序崩溃。

7.IndexError: 索引错误,通常是由于使用了超出序列范围的索引导致的。

        解决方法:确认索引值是否在序列范围内,确保不超出序列的长度。

8.KeyError: 键错误,通常是由于使用了不存在的键导致的。

        解决方法:确保键存在于字典中,可以使用in关键字检查键是否存在。

9.FileNotFoundError: 文件不存在错误,通常是由于尝试打开不存在的文件导致的。

        解决方法:确认文件路径是否正确,确保文件存在。

10.ImportError: 导入错误,通常是由于导入模块或包时出现问题导致的。

        解决方法:确认模块或包的路径是否正确,确保模块存在。

11. IOError(输入输出错误):当发生与文件输入输出相关的问题时,会引发此异常。

        解决方法:确保文件访问权限正确,并检查是否存在其他与文件输入输出相关的问题

12.AttributeError(属性错误):当使用不存在的属性或方法时,会引发此异常。

        解决方法:确保属性或方法存在于对象中,或者在访问属性或调用方法之前,对对象进行正确的初始化。

RuntimeError:运行时错误,由于无法归类到其他异常类型,因此通常作为基类被抛出。

    

        处理异常的一般方法是使用try...except语句。在try块中执行可能引发异常的代码,如果出现异常,则会跳转到except块中处理异常。通过捕获并处理异常,可以避免程序崩溃,增加程序的健壮性和容错性。

二  常用的异常处理语句

Exception是所有内置异常的基类,在Python中所有异常类都是从Exception类继承而来的。当程序出现异常时,会抛出相应的异常对象,如果这些异常没有被处理,程序将会终止执行。为了解决异常,我们可以采取以下方法:

1 try...except语句 

        在可能引发异常的代码块中使用try...except语句,以捕获并处理异常。在try块中放置可能引发异常的代码,如果出现异常,则在except块中处理异常。

示例 1: 捕获特定异常类型

try:
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
    print("结果:", result)
except ValueError:
    print("请输入有效的整数值!")
except ZeroDivisionError:
    print("除数不能为零!")

在上述示例中,我们尝试将用户输入的字符串转换为整数,并进行除法运算。如果用户输入的不是有效的整数,会触发ValueError异常,并打印出相应的错误消息。如果除数是零,会触发ZeroDivisionError异常,并打印出相应的错误消息。

示例 2: 捕获所有异常

try:
    num = int(input("请输入一个整数: "))
    result = 10 / num
    print("结果:", result)
except Exception as e:
    print("发生了异常:", e)

 在这个示例中,我们尝试将用户输入的字符串转换为整数,并将其作为除数进行除法运算。无论发生什么类型的异常,except Exception语句将捕获并处理异常,并将异常对象赋值给变量e。然后,我们打印出异常消息。

示例 3: 捕获多个异常类型

try:
    file = open("nonexistent.txt", "r")
    content = file.read()
    file.close()
    print("文件内容:", content)
except FileNotFoundError:
    print("文件不存在!")
except PermissionError:
    print("没有文件访问权限!")
except Exception as e:
    print("发生了异常:", e)

在上述示例中,我们试图打开一个不存在的文件并读取其内容。如果文件不存在,会触发FileNotFoundError异常;如果没有足够的权限访问文件,会触发PermissionError异常。我们使用多个except语句来捕获不同类型的异常,并打印出相应的错误消息。如果发生了其他类型的异常,它将被except Exception语句捕获,并打印出异常消息。

2 try...except...else语句

        除了捕获异常,还可以在try...except语句中添加else块,用于处理没有异常时的情况。

        它允许我们尝试执行可能引发异常的代码块,如果出现异常,则可以在 except 块中处理异常情况,而在 else 块中处理正常执行的情况。

语法结构如下:

try:
    # 可能引发异常的代码块
except ExceptionType:
    # 处理指定类型的异常
else:
    # 没有异常时执行的代码块

示例1:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("Error: Division by zero!")
    else:
        print(f"The result of {x} divided by {y} is {result}")

divide(10, 2)   # Output: The result of 10 divided by 2 is 5.0
divide(10, 0)   # Output: Error: Division by zero!

示例2; 

try:
    num1 = int(input("请输入一个整数: "))
    num2 = int(input("请输入另一个整数: "))
    result = num1 / num2
except ValueError:
    print("请输入有效的整数值!")
except ZeroDivisionError:
    print("除数不能为零!")
else:
    print("结果:", result)

在这个示例中,我们对用户输入的两个整数进行除法运算。如果用户输入的不是有效的整数,将触发ValueError异常;如果除数为零,将触发ZeroDivisionError异常。如果没有发生异常,将在else块中打印出结果。

无论是except块还是else块,最多只有一个块会被执行。如果发生了异常,将执行相应的except块;如果没有发生异常,将执行else块。

另:try-except-else语句中的except块是可选的,你可以选择只使用try和else块,也可以添加多个except块来捕获不同类型的异常

3 try...except...finally语句

        在try...except语句中可以添加finally块,无论是否发生异常,finally块中的代码都会被执行。它用于捕获和处理可能发生的异常,并在不管是否出现异常的情况下执行一些代码块。

   try块包含可能会引发异常的代码,except块用于处理异常,而finally块中的代码始终会执行,无论是否发生异常。

以下是try...except...finally语句的详细解释和示例:

  1. try块:包含可能引发异常的代码。

  2. except块:用于捕获和处理异常。当在try块中发生异常时,程序将跳过try块的剩余代码,并执行except块中的代码。可以使用except后面跟具体的异常类型来处理特定类型的异常,也可以使用except后面不跟任何异常类型来处理所有异常。

  3. finally块:包含的代码始终会执行,无论是否发生异常。无论是否发生异常,finally块中的代码都会被执行,用于确保在异常发生时执行一些必要的清理工作。

下面是一个简单的示例,演示了try...except...finally语句的使用:

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("除数不能为零!")
        result = None
    finally:
        print("执行finally块!")
    return result

# 调用函数
print(divide(10, 2))  # 输出: 5.0
print(divide(10, 0))  # 输出: 除数不能为零! 执行finally块! None

        在上面的示例中,我们定义了一个divide函数,该函数接受两个参数xy,并尝试将x除以y。如果y为零,将会触发ZeroDivisionError异常。在try块中,我们尝试执行除法运算,如果发生异常,则会执行except块中的代码打印错误消息。无论是否发生异常,finally块中的代码都会被执行。

注意:finally块中的代码是可选的,可以省略不使用。在try...except结构中,try块是必需的,而except块和finally块是可选的。

4 使用raise语句抛出异常

        在Python中,使用raise语句可以手动抛出异常。raise语句允许您在代码的特定位置主动引发异常,以便在必要时进行错误处理。

  raise语句的一般语法如下:

raise [ExceptionType[(args)]]

         其中,ExceptionType是异常的类型,可以是内置的异常类型(如ValueErrorTypeError等),也可以是自定义的异常类型。args是一个可选的参数,用于提供关于异常的额外信息。

        以下是一个使用raise语句抛出异常的示例:

def divide(x, y):
    if y == 0:
        raise ValueError("除数不能为零!")
    return x / y

try:
    result = divide(10, 0)
    print(result)
except ValueError as e:
    print("发生异常:", e)

在上面的示例中,我们定义了一个divide函数,该函数接受两个参数xy。如果y为零,我们使用raise语句抛出一个ValueError异常,并提供一个错误消息"除数不能为零!"。在try块中调用divide函数,并在except块中捕获并处理抛出的异常。

输出结果:

发生异常: 除数不能为零!

通过使用raise语句,您可以在需要的地方主动引发异常,并在合适的位置进行异常处理。这样可以增强代码的可读性和健壮性,使得错误处理更加灵活和准确。

5 自定义异常类型

        如果需要处理特定类型的异常,可以自定义异常类,并在需要时抛出该异常。 

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

try:
    raise MyError("自定义异常")
except MyError as e:
    print("捕获自定义异常:", e.message)

6 异常链处理

        如果在当前位置无法处理异常,可以将异常传递给上层调用函数处理,形成异常链。

def func():
    try:
        result = 10 / 0
    except ZeroDivisionError as e:
        raise MyError("发生异常:") from e

try:
    func()
except MyError as e:
    print("捕获异常链:", e)

       

以上 这些方法可以帮助我们处理和解决异常,确保程序的稳定性和可靠性。但要注意,异常处理应该合理使用,避免过度使用try...except语句,应该根据具体情况进行异常处理,以保持代码的清晰和可读性。

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

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

相关文章

华为eNSP:路由引入

一、拓扑图 二、路由器的配置 1、配置路由器的IP AR1: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]qu AR2: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huaw…

【Lua学习笔记】Lua进阶——函数和闭包

文章目录 函数函数嵌套闭包Closures可变函数函数重载 函数 函数嵌套 function A()print("这里是函数A")return function ()print("返回函数不要起名")end end B A() B()输出: 这里是函数A 返回函数不要起名使用函数嵌套的用法,我…

power dns recursor 4.5以后版本的奇葩问题

问题 最近升级了 pdns-recursor 从 4.1.X 升级至 4.8.x 出现下面问题 效果为 nslookup 可以返回 ip 地址 dig 无法返回对应 ip 地址 ad dns 服务器转发过来的解析都不响应 tcp 抓包如下 当使用 nslookup 请求时 addition rrs 请求为 0 当使用 dig 请求时 addition rrs 请求为 1…

Java虚拟机——Java内存模型

"Java内存模型"来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。主要目的:定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细…

用 Node.js 手写 WebSocket 协议

目录 引言 从 http 到 websocekt 的切换 Sec-WebSocket-Key 与 Sec-WebSocket-Accept 全新的二进制协议 自己实现一个 websocket 服务器 按照协议格式解析收到的Buffer 取出opcode 取出MASK与payload长度 根据mask key读取数据 根据类型处理数据 frame 帧 数据的发…

使用Python搭建代理服务器- 爬虫代理服务器详细指南

搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP。下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器: 1. 首先,确保你已经安装了Python。你可以在官方网站(https://www.python.org/)下载并安装最新版本的Python。 2. 安…

一.MySQL的主从复制

目录 一.MySQL的主从复制 1.2主从复制的工作过程和原理 1.2.1主从复制工作过程为两日志和三线程 ​编辑 1.2.2主从复制的工作原理 1.3主从复制延迟的原因 1.4主从复制的架构 1.5.MySQL四种同步方式 1.5.1异步复制(Async Replication) 1.5.2 同步复制(Sync Re…

新功能 – Cloud WAN:托管 WAN 服务

我很高兴地宣布,我们推出了 Amazon Cloud WAN,这是一项新的网络服务,它可以轻松构建和运营连接您的数据中心和分支机构以及多个 Amazon 区域中的多个 VPC 的广域网(WAN)。 亚马逊云科技开发者社区为开发者们提供全球的…

Linux centos7.x系统 下没有ens33 网卡的解决方案

一、背景 安装完windows11 Centos7.9 版本的双系统之后 , 启动Centos7.9时发现没有网卡信息 , 只有ifcfg-lo网卡的信息 , 这个时候就证明没有网卡信息,或者网卡驱动不匹配(我这里是没有网卡),所以我们要重新安装 , 安装步骤如下 : 二、安装步骤 1.查…

使用分布式HTTP代理爬虫实现数据抓取与分析的案例研究

在当今信息爆炸的时代,数据已经成为企业决策和发展的核心资源。然而,要获取大规模的数据并进行有效的分析是一项艰巨的任务。为了解决这一难题,我们进行了一项案例研究,通过使用分布式HTTP代理爬虫,实现数据抓取与分析…

C++多线程编程(第二章 多线程通信和同步)

1、多线程状态 1.1线程状态说明 初始化(Init):该线程正在被创建; 就绪(Ready):该线程在就绪列表中,等待CPU调度; 运行(Running):该线程正在运行; 阻塞&…

吉林大学计算机软件考研经验贴

文章目录 简介政治英语数学专业课 简介 本人23考研,一战上岸吉林大学软件工程专硕,政治72分,英一71分,数二144分,专业课967综合146分,总分433分,上图: 如果学弟学妹需要专业课资料…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址:torch.nn — PyTorch 2.0 documentation 常用的:Sigmoid、ReLU、LeakyReLU等。 作用:为模型引入非线性特征,这样才能在训练过程中…

leetcode 852. Peak Index in a Mountain Array(峰值索引)

一个数组保证是峰值数组(存在一个值大于左边和右边部分数组),找出峰值的index。 要求时间复杂度在O(logn)。 思路: 时间复杂度为O(logn), 可以想到用binary search. 其实用O(n)的找最大值也能通过。 public int peakIndexInMou…

Spring Boot 拦截器实现:登录验证 统一异常处理 返回数据规范化

学习 Spring 和 servlet 初期,我们在判断用户身份时,都是在每个方法中获取会话、获取对象,这种方式冗余度高,增加代码复杂度,维护成本也高,因此想到可以使用 AOP 来实现一个公共的方法,这个公共…

android逆向环境下载记录

frida、frida_tools、obejction、wallbreaker https://github.com/frida/frida/releases pip install frida14.1.2 pip install frida-tools9.0.1 pip install objection1.9.6 https://github.com/hluwa/Wallbreaker objection -g com.hexin.plat.android explore -P ~/.objec…

JAVA基础-基于多线程的聊天程序

引言 什么是程序 ? 一个程序可以有多个进程 。程序是一段静态的代码,它是应用程序执行的蓝本。 什么是进程 ? 一个进程可以有多线程 进程是指一种正在运行的程序,有自己的地址空间。 作为蓝本的程序可以被多次加载到系统的不同内…

智能也是一切社会关系的总和

马克思把人作为“一切社会关系的总和”的论述中,他并非将自然条件作为固定的被给予的条件,而是作为在历史进程中,由于人的活动而发生的改变的被给予的条件来把握的,既从一开始就已经被一定的“生产关系”所塑形和中介了。智能&…

计算机启动过程uefi+gpt方式

启动过程: 一、通电 按下开关,不用多说 二、uefi阶段 通电后,cpu第一条指令是执行uefi固件代码。 uefi固件代码固化在主板上的rom中。 (一)uefi介绍 UEFI,全称Unified Extensible Firmware Interface&am…

Upload-Labs通关

目录 问题 我们首先先来了解一下什么是文件上传 一句话木马 web是用什么语言开发的 最简单的一句话木马 解释 了解完一句话木马 我们了解一下 蚁剑的工作原理 Pass-1 前端验证 1.通过浏览器的插件 关闭这个前端函数 2.通过bp来抓包修改后缀 Pass-2 文件类型的匹配 …