原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
文章目录
前言
在 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),它们都是预定义的异常类型,可以在代码中被触发和处理。以下是一些常见的内置异常:
-
ValueError:当传递给函数或方法的参数类型不正确或者参数的值不合法时,会引发此异常。
-
TypeError:当使用了错误的数据类型或数据类型不匹配时,会引发此异常。
-
IndexError:当尝试访问序列中不存在的元素时,会引发此异常。
-
KeyError:当尝试使用字典中不存在的键时,会引发此异常。
-
ZeroDivisionError:当尝试除以零时,会引发此异常。
-
NameError:当尝试访问不存在的变量时,会引发此异常。
-
IOError:当尝试读取不存在的文件或文件不可读时,会引发此异常。
-
AttributeError:当尝试访问不存在的对象属性时,会引发此异常。
-
NotImplementedError:当尝试调用尚未实现的方法或函数时,会引发此异常。
-
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
异常,并显示指定的错误消息。
断言语句非常有用,在开发和调试过程中,可以用它们来检查代码的正确性,并在错误发生时快速定位问题。但请注意,在部署代码之前,请务必禁用或删除所有断言语句。