当前位置: 首页 > article >正文

【Python知识】python基础-关于异常处理

python的异常处理知识

    • 概览
      • 基本用法
      • 自定义异常
      • 捕获特定异常信息
    • 异常抛出

概览

在Python中,异常处理是通过tryexceptfinally等关键字来实现的。这些关键字允许你捕获和处理在程序运行时可能出现的错误和异常情况,从而避免程序崩溃,并允许程序在异常发生后继续执行其他操作。以下是一些基本的用法和示例:

基本用法

  1. try-except块

    try:
        # 可能会抛出异常的代码
        result = 10 / 0
    except ZeroDivisionError:
        # 处理ZeroDivisionError异常的代码
        print("除数不能为零")
    
  2. 捕获多个异常

    try:
        # 可能会抛出异常的代码
        value = int("abc")
    except (ValueError, TypeError):
        # 处理ValueError和TypeError异常的代码
        print("输入值无效或类型错误")
    
  3. 捕获所有异常

    try:
        # 可能会抛出异常的代码
        result = 10 / (int("abc") - 5)
    except Exception as e:
        # 处理所有异常的代码,并打印异常信息
        print(f"发生了一个异常: {e}")
    
  4. 获取异常信息

    try:
        # 可能会抛出异常的代码
        result = 10 / 0
    except ZeroDivisionError as e:
        # 处理ZeroDivisionError异常的代码,并打印异常信息
        print(f"捕获到异常: {e}")
    
  5. try-finally块

    try:
        # 可能会抛出异常的代码
        print("尝试执行一些操作")
    finally:
        # 无论是否发生异常,都会执行的代码
        print("执行清理操作")
    
  6. try-except-finally块

    try:
        # 可能会抛出异常的代码
        print("尝试执行一些操作")
        result = 10 / 0
    except ZeroDivisionError:
        # 处理ZeroDivisionError异常的代码
        print("除数不能为零")
    finally:
        # 无论是否发生异常,都会执行的代码
        print("执行清理操作")
    

自定义异常

你也可以定义自己的异常类,通过继承Python内置的Exception类来实现。

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

    def __str__(self):
        return self.message

try:
    # 可能会抛出自定义异常的代码
    raise MyCustomError("这是一个自定义异常")
except MyCustomError as e:
    # 处理自定义异常的代码
    print(f"捕获到自定义异常: {e}")

捕获特定异常信息

有时你可能需要更详细地处理异常,比如获取堆栈跟踪信息。可以使用traceback模块来实现。

import traceback

try:
    # 可能会抛出异常的代码
    result = 10 / 0
except Exception as e:
    # 打印异常信息和堆栈跟踪
    traceback.print_exc()
    print(f"捕获到异常: {e}")

通过以上这些方法和技巧,你可以有效地处理Python中的异常,提高程序的健壮性和可靠性。

异常抛出

在Python中,异常抛出(或称为引发异常)是通过使用raise语句来实现的。当程序执行过程中遇到错误或异常情况时,可以使用raise语句来抛出一个异常对象。这个异常对象可以是Python内置的异常类型(如ValueErrorTypeErrorZeroDivisionError等),也可以是用户自定义的异常类型。

以下是关于Python异常抛出的一些关键点:

  1. 抛出内置异常
    你可以直接抛出Python内置的异常类型。例如:

    raise ValueError("这是一个值错误")
    raise TypeError("这是一个类型错误")
    

    这些语句会立即中断当前函数的执行,并将异常对象传递给调用者。

  2. 抛出用户自定义异常
    你可以通过定义一个继承自Exception的类来创建自定义异常类型,并使用raise语句抛出它。例如:

    class MyCustomError(Exception):
        def __init__(self, message):
            super().__init__(message)
            self.message = message
    
        def __str__(self):
            return self.message
    
    raise MyCustomError("这是一个自定义异常")
    
  3. 在异常处理中重新抛出异常
    except块中,你可以捕获一个异常,执行一些操作(如记录日志、清理资源等),然后重新抛出该异常(或抛出另一个异常)。这可以通过不带表达式的raise语句或使用raise ... from ...语法来实现后者允许你指定原始异常和新的异常之间的因果关系。例如:

    try:
        # 可能会抛出异常的代码
        pass
    except SomeError as e:
        # 执行一些操作
        print(f"捕获到异常: {e}")
        # 重新抛出异常
        raise
    
    # 或者使用 from 语法来指定原始异常
    try:
        # 可能会抛出异常的代码
        pass
    except SomeError as e:
        # 执行一些操作
        new_error = AnotherError("这是另一个异常")
        raise new_error from e
    
  4. 抛出带有额外信息的异常
    当抛出异常时,你可以传递一个字符串或其他对象作为异常的消息。这个消息通常用于描述异常的原因或上下文。例如:

    raise ValueError(f"无效的输入值: {input_value}")
    
  5. 在函数中抛出异常
    在定义函数时,如果函数遇到无法处理的错误情况,可以抛出异常来通知调用者。调用者可以捕获该异常并采取相应的措施。例如:

    def divide(a, b):
        if b == 0:
            raise ZeroDivisionError("除数不能为零")
        return a / b
    

通过合理使用raise语句和异常处理机制(try-except-finally块),你可以编写出更加健壮和易于维护的Python代码。


http://www.kler.cn/a/442321.html

相关文章:

  • 【c++继承篇】--继承之道:在C++的世界中编织血脉与传承
  • css中的阴影详解
  • 【Uniapp-Vue3】uni-api交互反馈showToast的使用方法
  • openharmony标准系统方案之瑞芯微RK3568移植案例
  • 关于jwt和security
  • 玩转随机数:用 JavaScript 掌控不可预测的魔力!
  • Ollydbg 编写脚本的一些语法及例子(OD脚本)
  • 分布式开发学习
  • 基于java的springboot和vue ui的简单网站
  • 【Java】Java8的Stream流入门使用
  • 搭建分布式Spark集群
  • Golang学习笔记_13——数组
  • MR30分布式IO模块:驱动物流传输机高效升级
  • 鸿蒙Next条件渲染用法总结
  • GPT 时代,精进编程思维 + 熟练 Prompt 是否是新的编程范式?
  • HTMLCSS:3D动态卡车
  • ChatGPT生成测试用例的最佳实践(三)
  • 设计模式——单例模式(饿汉式,懒汉式等)
  • 用户输入 %%%% , MYSQL中数据全被查询出来的Bug(GORM)
  • Java程序员如何高效学习Spring Cloud Alibaba?
  • 【ETCD】ETCD 架构揭秘:内部各组件概览
  • 基于 SSM 和 Vue 架构的新锐台球厅管理系统:创新设计引领高效实现
  • RabbitMQ中的Publish-Subscribe模式
  • 单片机:实现教学上下课的自动打玲(附带源码)
  • 【数理统计】极限定理及抽样分布
  • python之求平面离散点集围成的面积