6.异常

七言 2025-8-1 13 8/1

[TOC]

异常

  • 定义:当python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的'异常'

捕获异常

  • 在Python中,处理异常(也称为错误)的主要机制是使用try和except语句

基本语法

try:
可能发生错误的代码
except 异常类型:
如果捕获到该异常类型执行的代码

示例

try:
    # 尝试执行的代码块
    result = 10 / 0  # 这里会抛出一个ZeroDivisionError
except ZeroDivisionError:
    # 如果在try块中发生了ZeroDivisionError异常,则执行这里的代码
    print("除数不能为零!")
  • 捕获所有类型的异常或者多个异常类型

示例

try:
    # 尝试执行的代码块
    result = 10 / int('a')  # 这里会抛出一个ValueError
except (ValueError, ZeroDivisionError):
    # 捕获ValueError或ZeroDivisionError异常
    print("发生了一个错误!")
except Exception as e:
    # 捕获所有其他类型的异常
    print(f"发生了一个未知错误:{e}")
*   Exception是所有程序异常类的父类

异常的finally

  • finally子句来指定无论是否发生异常都会执行的代码

示例

try:
    # 尝试执行的代码块
    result = 10 / 5  # 这里不会抛出异常
except ZeroDivisionError:
    print("除数不能为零!")
finally:
    # 这里的代码总是会被执行
    print("清理资源...")

异常的else

  • else子句来编写在没有异常发生时才执行的代码

示例

try:
    # 尝试执行的代码块
    result = 10 / 5  # 这里不会抛出异常
except ZeroDivisionError:
    print("除数不能为零!")
else:
    # 如果没有异常发生,这里的代码会被执行
    print(f"结果是:{result}")
finally:
    # 这里的代码总是会被执行
    print("清理资源...")

抛出异常

  • 异常抛出,当有一些异常自己处理不了或者不想处理,需要向调用方抛出
  • 手动抛出异常,需要使用raise语句,后跟异常类名或异常类的实例

抛出内置异常

  • 抛出Python内置的异常类型,如ValueError,TypeError,IOError等

示例

# 如果discount大于100,就会抛出一个ValueError异常

def apply_discount(product,discount):
    if discount > 100:
        raise ValueError('折扣百分比不能超过100')
    final_price = product.price * (1.0 - discount / 100)
    return final_price

raise

  • raise 是一个关键字,用于抛出(raise)一个异常(exception)。当 raise 语句被执行时,它会立即停止当前代码的执行,并将控制权传递给最近的 try-except 块或 finally 子句
  • raise 可以用来抛出一个已有的异常,或者创建一个新的异常并抛出

引发自定义异常

示例

age = -10

if age < 0:
    raise ValueError("年龄不能为负数")

print("Age:", age)

在try...except...块中重新引发捕获的异常

示例

def divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError as e:
        print("除数不能为零!")
        raise  # 使用不带参数的raise重新引发异常
    return result

try:
    print(divide(10, 0))
except ZeroDivisionError as e:
    print("捕获到异常:", e)
*   在divide函数中捕获了ZeroDivisionError异常,并在except块中使用不带参数的raise重新引发了它。这意味着异常将被传递回调用divide函数的代码,并在那里被捕获和处理。
- THE END -

七言

8月01日16:49

最后修改:2025年8月1日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论