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

简介: 【100天精通python】Day17:python程序异常与调试_常见异常类型与解决,异常处理语句

https://blog.csdn.net/qq_35831906/category_12375510.html?spm=1001.2014.3001.5482

专栏导读

       本文收录于专栏《100天精通python》,  该专栏面向初学者和进阶者,系统快速掌握Python编程语言的核心概念和实践技巧,掌握Python的基础语法、数据类型、函数、模块、面向对象编程等关键知识,进而深入项目实战,用python解决实际问题!

 探索Python的魅力,驾驭编程世界!Let's GO!

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html

f8d8821388dc41358195b24b9133d6b0.png

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

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

15bdb6fbeb2d4b6f8d409f0698385379.png

在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函数,该函数接受两个参数x和y,并尝试将x除以y。如果y为零,将会触发ZeroDivisionError异常。在try块中,我们尝试执行除法运算,如果发生异常,则会执行except块中的代码打印错误消息。无论是否发生异常,finally块中的代码都会被执行。

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

4 使用raise语句抛出异常

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

 raise语句的一般语法如下:

raise [ExceptionType[(args)]]

        其中,ExceptionType是异常的类型,可以是内置的异常类型(如ValueError、TypeError等),也可以是自定义的异常类型。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函数,该函数接受两个参数x和y。如果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语句,应该根据具体情况进行异常处理,以保持代码的清晰和可读性。

python程序异常与调试 下一篇: 【100天精通python】Day18:python程序异常与调试_常用程序调试方式与技巧,如何将调试代码与正式代码分开_LeapMay的博客-CSDN博客

目录
相关文章
|
23天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
24天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
26天前
|
存储 JSON 监控
告别Print,使用IceCream进行高效的Python调试
本文将介绍**IceCream**库,这个专门用于调试的工具显著提升了调试效率,使整个过程更加系统化和规范化。
44 2
告别Print,使用IceCream进行高效的Python调试
|
25天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
1月前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
67 3
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
40 3
|
1月前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
26 3
|
1月前
|
存储 机器学习/深度学习 搜索推荐
Python编程入门:从零开始构建你的第一个程序
【10月更文挑战第32天】本文旨在通过浅显易懂的方式引导编程新手进入Python的世界。我们将一起探索Python的基础语法,并通过实例学习如何构建一个简单的程序。文章将不直接展示代码,而是鼓励读者在阅读过程中自行尝试编写,以加深理解和记忆。无论你是编程初学者还是希望巩固基础知识的开发者,这篇文章都将是你的良师益友。让我们开始吧!
|
17天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
23天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。