【Python】异常处理:try+except和断言assert

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。



前言

在 Python 中,异常是一种表示程序执行期间发生错误的方式。当出现异常时,程序会停止执行,并且根据异常类型决定是否终止程序。
为了避免程序终止,我们可以使用异常处理来捕获和处理异常。在 Python 中,我们使用 try-except 语句来实现异常处理。try 块包含可能会引发异常的代码,而 except 块用于处理异常。


一、常见用法

try:
    num1 = int(input("请输入一个数字:"))
    num2 = int(input("请输入另一个数字:"))
    result = num1 / num2
    print("结果为:", result)
except ZeroDivisionError:
    print("除数为零错误!")
except ValueError:
    print("输入的不是数字!")

在这个例子中,我们使用 try-except 语句来处理可能会引发异常的除法操作。如果 num2 为零,则会引发 ZeroDivisionError 异常,如果输入的不是数字,则会引发 ValueError 异常。根据具体情况,我们使用两个 except 块来处理这两种异常。

二、内置异常类

Python中有许多内置异常(built-in exceptions),它们都是预定义的异常类型,可以在代码中被触发和处理。以下是一些常见的内置异常:

  1. ValueError:当传递给函数或方法的参数类型不正确或者参数的值不合法时,会引发此异常。

  2. TypeError:当使用了错误的数据类型或数据类型不匹配时,会引发此异常。

  3. IndexError:当尝试访问序列中不存在的元素时,会引发此异常。

  4. KeyError:当尝试使用字典中不存在的键时,会引发此异常。

  5. ZeroDivisionError:当尝试除以零时,会引发此异常。

  6. NameError:当尝试访问不存在的变量时,会引发此异常。

  7. IOError:当尝试读取不存在的文件或文件不可读时,会引发此异常。

  8. AttributeError:当尝试访问不存在的对象属性时,会引发此异常。

  9. NotImplementedError:当尝试调用尚未实现的方法或函数时,会引发此异常。

  10. KeyboardInterrupt:当用户中断程序的执行时,会引发此异常。

以上是常见的内置异常类型,但 Python 还有许多其他类型的异常。

三、else和finally

除了使用 except 块来处理异常,我们还可以使用 finally 块来执行一些必要的清理操作。无论是否出现异常,finally 块中的代码都会被执行。

示例:

try:
    num = int(input("请输入一个数字:"))
    result = 10 / num
    print("结果为:", result)
except ZeroDivisionError:
    print("除数为零错误!")
else:
    print("可以获得num值",num )

示例:

try:
    file = open("test.txt","w")
    file.write("Hello World")
except:
    print("文件操作失败")
finally:
    file.close()

在这个例子中,我们使用 finally 块来输出程序执行结束的信息,以确保无论是否出现异常,都会输出这个信息。

我们常用的with open(‘xx.txt’,‘w’) 打开文件实现的就是类似finally的功能。

finally的真正作用

def func():
	try:
		return 'try'
	finally:
		return 'finally'
print(func())
finally
def func():
	try:
		return 'try'
	finally:
		print('finally')
print(func())
finally
try

四、自定义异常

1.异常类

定义自己的异常处理其实很简单,继承内置 Exception 类就可以。

class MyCustomException(Exception):
    def __init__(self, code , message):
        self.code = code 
        self.message = message

    def __str__(self):
        return (self.code ,self.message)

2.抛出异常

from xx import MyCustomException

def test():
	if 1==1:
		raise MyCustomException(12305,"This is a custom exception.")
	else:
		return 

try:
    test()
except MyCustomException as e:
    print(e)

结果:(12305,“This is a custom exception.”)

在上面的示例中,我们使用 raise 语句触发自定义异常,并使用 except 语句捕获它。由于我们在自定义异常类中定义了 str 方法,因此 print 语句将打印自定义异常消息。

五、捕获异常的详细信息

1.获取异常的堆栈跟踪

import traceback

try:
    # 可能会出现异常的代码块
except Exception as e:
    # 处理异常的代码块
    print("异常类型:", type(e).__name__)
    print("异常信息:", str(e))
    print("堆栈跟踪:")
    traceback.print_tb(e.__traceback__)

2.获取异常发生的文件和行号

import traceback

def divide(x, y):
    try:
        result = x / y
        print("结果:", result)
    except Exception as e:
        print("异常类型:", type(e).__name__)
        print("异常信息:", str(e))
        print("异常发生的文件和行号:")
        traceback.print_exc()

divide(10, 2)
divide(10, 0)

3.获取异常的字符串输出,写入日志

import traceback

def divide(x, y):
    try:
        result = x / y
        print("结果:", result)
    except Exception as e:
        print("异常类型:", type(e).__name__)
        print("异常信息:", str(e))
        print("异常发生的文件和行号:")
        aa = traceback.format_exc()
        print(type(aa))
        print('11')
        print(aa)

divide(10, 2)
divide(10, 0)

六、断言assert

Python 中的断言 assert 是一个调试工具,用于在开发和调试过程中检查代码。当使用 assert 时,我们可以在代码中插入一些检查语句,以确保代码的正确性。

如果断言的条件为 False,则会引发 AssertionError 异常,并且程序会停止执行。如果断言的条件为 True,则程序会继续执行,就像断言语句不存在一样。

以下是一个简单的示例,在这个示例中,我们使用 assert 语句来检查代码中的条件:

x = 5
assert x > 3, "x 应该大于 3"

在上面的代码中,我们使用断言来检查变量 x 是否大于 3。如果 x 的值小于或等于 3,则会引发 AssertionError 异常,并显示指定的错误消息。

断言语句非常有用,在开发和调试过程中,可以用它们来检查代码的正确性,并在错误发生时快速定位问题。但请注意,在部署代码之前,请务必禁用或删除所有断言语句。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我辈李想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值