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

news2024/11/23 21:13:56

   目录

一  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语句,应该根据具体情况进行异常处理,以保持代码的清晰和可读性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot实践二 --Web开发

一、模板引擎简介 在之前的示例中,我们通过RestController来处理请求: package com.example.demospringboot.web;import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping;Re…

1.Web API基本认知

变量声明 const优先,尽量使用const ●const声明的值不能更改,而且const声明变量的时候需要里面进行初始化 ●简单数据类型 用const声明后不能修改值 ●但是对于 引用数据类型,const声明的变量,里面存的不是值,是地址&a…

spring-authorization-server (1.1.1)自定义认证

前言 注意:我本地没有生成公钥和私钥,所以每次启动项目jwkSource都会重新生成,导致之前认证的token都会失效,具体如何生成私钥和公钥以及怎么配置到授权服务器中,网上有很多方法自行实现即可 之前有个项目用的0.0.3的…

ATA-2021B高压放大器经典应用合集(内附技术指标)

多年来Aigtek安泰电子一直潜心于电子测试仪器的研发,已拥有完善的功率放大器产品线,并针对超声声学、无损检测、电磁驱动、生物医疗、微流控、材料测试等主流各行业领域测试建立的了专属测试方案,在国内功率放大器行业及市场中获得认可&#…

【智能可视化---01】揭示Python AI中Matplotlib的魅力,提升数据洞察力!探索AI 中的Matplotlib,这一篇就够了!

Success keeps eluding me yet my passion abides. 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工智能领域优质创作者…

团队运营能力不足?「企业学院」3大板块全面提升运营技能

『矩阵通』本期上线「企业学院」功能,内容包含新媒体培训课程、行业动态资讯及新媒体营销、矩阵运营的干货指南等,帮助企业提高团队运营能力,对此功能感兴趣的客户可前往矩阵通官网(matrix.newrank.cn)体验。 在当今数…

太绝了!医疗行业管理,原来可以这么简单!

在现代医疗领域,科技的不断进步和创新为医疗设备的发展带来了前所未有的突破和提升。然而,这些先进的医疗设备往往对其运行环境的要求非常严格,尤其是温度和湿度等参数的稳定性。 因此,为了确保医疗设备的高效、可靠运行&#xff…

【学会动态规划】删除并获得点数(13)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

百度智能云连拿四年第一,为什么要深耕AI公有云市场

AI是过去几年云计算市场中的最大变量,而大模型的成熟,毫无疑问将指数级增强这个变量。 记得在2022年年底,生成式AI与大模型开始爆火的时候,我们就曾讨论过一个问题:这轮AI浪潮中,最先受到深刻影响的将是云计…

利用spss进行多元逐步回归

1.首先用代码将变量归一化 我这第5列及后是我要归一化的数据,将归一化后的数据保存为nor_result.csv文件 import pandas as pd from sklearn.preprocessing import MinMaxScalerdf pd.read_csv(E:\\Sentinel12\\yangben\\result.csv) cols_to_normalize df.colu…

vue3 + TS + VueUse 快捷存取操作cookie,存储用户token流程

1.依赖安装 VueUse可以为Vue开发提供方便和高效的支持,提高开发效率和代码质量。 VueUse网址:https://vueuse.org/integrations/useCookies/#usecookies 依赖1(主):npm i vueuse/integrations 依赖2(模块):npm i universal-cooki…

PCB设计中常见的走线等长要求

1、在做 PCB 设计时,为了满足某一组所有信号线的总长度满足在一个公差范围内,通常要使用蛇形走线将总长度较短的信号线绕到与组内最长的信号线长度公差范围内,这个用蛇形走线绕长信号线的处理过程,就是我们俗称的 PCB 信号等长处理…

GPT一键化身「AI助理」——自定义指令功能

最近GPT又更新了一个超实用的功能——自定义指令,启用后,你可以给GPT设置一些固定指令,让它记住或扮演某个角色,比如客服、律师、投资管理师、老师、营养师...... 这样,我们就不再需要每次都要打开新的聊天&#xff0c…

AT15透明屏有哪些特点?

AT15透明屏是一种新型的显示技术,它采用了透明材料制成的屏幕,可以实现透明显示效果。这种屏幕可以广泛应用于各种领域,如商业广告、展览展示、智能家居等。 AT15透明屏的特点之一是其高透明度。 由于采用了透明材料制成,AT15透明…

生成式人工智能新政策发布:AI进入规范时代!

最近,国家发布了《生成式人工智能服务管理暂行办法》。该条例于8月15日开始施行,使得AI应用进入规范化管理。该法明确了适用于提供生成文本、图片、音频、视频等内容的服务,鼓励人工智能技术在各行业、各领域的创新应用,生成积极健…

深度学习:常用优化器Optimizer简介

深度学习:常用优化器Optimizer简介 随机梯度下降SGD带动量的随机梯度下降SGD-MomentumSGDWAdamAdamW 随机梯度下降SGD 梯度下降算法是使权重参数沿着整个训练集的梯度方向下降,但往往深度学习的训练集规模很大,计算整个训练集的梯度需要很大…

【C++】 函数模板和类模板

文章目录 一、模板1.1 函数模板和类模板1.2 函数模板1.2.1 普通函数和函数模板区别1.2.2 普通函数和函数模板调用规则1.2.3 模板局限性 1.3 类模板1.3.1 类模板对象做函数参数1.3.2 类模板的继承1.3.3 类模板成员函数的类外实现1.3.4 类模板分文件编写1.3.5 类模板全局函数类内…

PaddleOCR C++编译出错解决方案

文章目录 前言一、环境准备1、主要环境2、源码下载3、C推理库下载 二、报错信息1.静态库调用错误2.ld returned 1 exit status 总结 前言 最近,想尝试下PaddleOCR的C推理,但是过程不如人所愿,除了很多问题,这里捡重点的说下吧&…

【Python 实战】---- 批量识别图片中的文字,存入excel中【使用百度的通用文字识别】

分析 1. 获取信息图片示例 2. 运行实例 3. 运行结果 4. 各个文件的位置 实现 1. 需求分析 识别图片中的文字【采用百度的通用文字识别】;文字筛选,按照分类获取对应的文本;采用 openpyxl 实现将数据存入 excel 中。2. 获取 access_token 获取本地缓存的

双虚拟机实现数据库自动备份

FTP的使用: 1.安装FTP 1、检测系统有没有安装ftp,执行命令: rpm -qa | grep ftp若存在用rpm命令移除后再行安装,执行命令: rpm -e vsftpd-3.0.2-9.e17.x86_642、如果没有安装,则在线安装ftp&#xff0c…