在Python无法正常处理程序时就会发生异常,此时我们需要捕捉并处理它,否则程序就会终止执行。
例如:
x = 1 / 0
print(x)
运行结果:
ZeroDivisionError: division by zero
#此时程序终止执行
Python提供了三个非常重要的功能来处理程序在运行过程中可能出现的异常和错误,其中try/except
(else、finally可放在except之后使用
)语句块、raise
语句是主要的异常处理机制,Assertions
(断言)主要用于调试。
一、try/except 语句块
- try/except 语句块用于捕获和处理异常。
- try 块包含可能引发异常的代码,而 except 块包含处理这些异常的代码。
- 当try 块中的代码引发异常时,程序会立即跳转到相应的 except 块,并执行该块中的代码。
如此,便在 except 块中编写处理错误的代码,以防止程序因为未处理的异常而崩溃。
示例1:
try:
x = 1 / 0 # 这将引发一个 ZeroDivisionError 异常
except ZeroDivisionError:
print("除数不能为0")
运行结果:
除数不能为0
#提示出错,但程序不会终止。
在这个例子中,尝试除以0,这将引发一个 ZeroDivisionError 异常。但是,由于使用了 try/except 语句块,所以程序会捕获到这个异常,并打印出 “除数不能为0” 的消息,而不是崩溃。
示例2:异常的参数
一个异常可以带上参数,可作为输出的异常信息参数。通过except语句来捕获异常的参数。
def temp_convert(var):
return int(var)
# 调用函数
try:
temp = temp_convert("xys")
except ValueError as a:
print(a)
运行结果:
invalid literal for int() with base 10: 'xys'
#会显示异常的参数,具体描述
二、raise 语句
raise 语句用于显式地引发一个异常。
当我们需要在程序中创建一个自定义错误,或者需要在特定条件下停止程序执行时,可以使用 raise 语句。
示例:在特定条件下停止程序执行
。
def divide(a, b):
if b == 0:
raise ValueError("除数不能为0啊") # 显式地引发一个 ValueError 异常
return a / b
try:
result = divide(1, 0)
except ValueError as e:
print(e)
运行结果:
除数不能为0啊
在这个例子中,定义一个 divide 函数,该函数在除数为0时会引发一个 ValueError 异常。然后使用 try/except 语句块来捕获和处理这个异常。当 divide(1, 0) 被调用时,会引发一个 ValueError 异常,然后 except 块会捕获这个异常,并打印出异常消息。
三、Assertions(断言)
- 断言(Assertions)是一种用于调试目的的机制,它允许程序员在代码中设置检查点,以确保程序在运行时满足某些条件。
- 如果断言的条件为假(即条件不满足),Python会引发一个AssertionError异常。
- 断言通常用于在开发阶段捕获可能的编程错误,而不是用于处理正常的程序流控制或异常条件。
语法:
assert condition, "optional error message"
其中:
condition
是一个表达式,它应该返回一个布尔值(True或False)。"optional error message"
是一个可选的字符串,当断言失败时,它将作为异常消息的一部分。- 若
condition为True
,则断言通过,程序继续执行。若condition为False
,则引发AssertionError
,程序将终止执行,并打印出可选的错误消息(如果有的话)
示例:
def divide(a, b):
assert b != 0, "除数不能为0啊啊啊"
return a / b
try:
result = divide(10, 0)
except AssertionError as e:
print(e)
运行结果:
除数不能为0啊啊啊
在这个例子,定义了一个divide函数,它使用断言来确保除数b不为0。如果尝试用0作为除数调用divide函数,断言将失败,并引发AssertionError,打印出"除数不能为0"的错误消息。
注意:断言主要用于开发和测试阶段,以确保代码逻辑的正确性。Python可以通过命令行选项(如-O或-OO)来禁用断言。
四、用户自定义异常
通过创建一个新的异常类来定义自定义异常,这通常是通过继承内置的异常类(如Exception
或它的子类)来完成的。
示例1:
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
try:
raise Networkerror("It's an Error")
except Networkerror as e:
print (e.args)
运行结果:('I', 't', "'", 's', ' ', 'a', 'n', ' ', 'E', 'r', 'r', 'o', 'r')
在这个例子里,创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。在try语句块中,用户自定义的异常后执行except块语句,变量 e 是用于创建Networkerror类的实例。
示例2:
class MyCustomException(Exception):
def __init__(self, message, code):
self.message = message
self.code = code
# 创建一个异常实例并引发它
def some_function():
# 模拟某些条件不满足,引发自定义异常
raise MyCustomException("这是一个自定义异常", 123)
try:
some_function()
except MyCustomException as e:
print(e.message,e.code)
print("捕获到自定义异常: {e}")
运行结果:
这是一个自定义异常 123
捕获到自定义异常: {e}
五、python标准异常
Python标准库定义了一系列内置异常,用于处理程序中可能出现的各种错误情况。这些异常提供了清晰的错误分类,帮助开发者更好地理解和处理错误。以下是一些常见的Python标准异常: