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 和 finally else 用于处理没有异常时的情况,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新手必学:输入输出全攻略

相关推荐

  1. Python错误异常处理

    2024-03-16 03:40:01       13 阅读
  2. python错误异常

    2024-03-16 03:40:01       22 阅读
  3. Python-错误异常处理

    2024-03-16 03:40:01       39 阅读
  4. python错误处理调试

    2024-03-16 03:40:01       11 阅读
  5. Python异常处理

    2024-03-16 03:40:01       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-16 03:40:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-16 03:40:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-16 03:40:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-16 03:40:01       20 阅读

热门阅读

  1. 专升本英语语法学习

    2024-03-16 03:40:01       22 阅读
  2. C++语言学习(一)—— 认识C++语言

    2024-03-16 03:40:01       19 阅读
  3. Docker学习

    2024-03-16 03:40:01       20 阅读
  4. 系统重装后git客户端的设置恢复

    2024-03-16 03:40:01       21 阅读
  5. 正则表达式中元字符的使用

    2024-03-16 03:40:01       21 阅读
  6. 空气质量指数(AQI)计算小结

    2024-03-16 03:40:01       22 阅读
  7. @产品经理!2024年NPDP报名时间请关注

    2024-03-16 03:40:01       19 阅读