常见的异常
- SyntaxError: 语法错误。当代码不符合 Python 语法规范时,会引发该异常。
if True
print("Hello") # 缺少冒号
- IndentationError: 缩进错误。Python 对代码缩进严格,错误的缩进会导致此异常。
def func():
print("Hello") # 缩进错误
- NameError: 尝试访问未声明的变量或函数。
print(x) # x 未定义
- TypeError: 操作或函数应用于不适当的类型。
'2' + 2 # 不能将字符串和整数相加
- ValueError: 函数接收到的参数类型正确,但值不合适。
int('abc') # 'abc' 不能被转换为整数
- IndexError: 使用无效的索引操作序列。
lst = [1, 2, 3]
print(lst[3]) # 索引超出范围
- KeyError: 试图访问字典中不存在的键。
d = {'a': 1}
print(d['b']) # 'b' 不在字典中
- AttributeError: 尝试访问对象不存在的属性。
lst = [1, 2, 3]
lst.push(4) # 列表对象没有 push 方法
- ImportError: 无法引入模块或包。
import non_existent_module # 模块不存在
- ZeroDivisionError: 尝试除以零。
result = 1 / 0 # 除以零
- FileNotFoundError: 尝试打开不存在的文件。
with open('non_existent_file.txt', 'r') as f:
content = f.read()
异常处理
异常处理使用方式
在Python中,try
, except
, else
, 和 finally
关键字用于处理可能会发生的异常情况。每个部分都有特定的用途,以下是它们的使用场景:
try:用于包裹可能引发异常的代码块。如果在try
块中的代码执行时发生异常,程序会跳到except
块处理异常。
try:
# 可能引发异常的代码
except:紧随try
块之后,用于处理try
块中发生的特定异常。可以有一个或多个except
块,以处理不同类型的异常。
except SomeException:
# 处理SomeException的代码
如果你想处理所有类型的异常,可以使用不带具体异常的except
:
except:
# 处理所有异常的代码
else:可选部分,用于在try
块中没有发生异常时执行的代码。else
块只能有一个,并且必须在所有except
块之后
else:
# 当没有异常发生时,执行这段代码
finally:可选部分,无论是否发生异常,finally
块中的代码都会执行,通常用于释放资源或执行清理操作,如关闭文件或网络连接。
finally:
# 不管发生什么情况,都会执行这段代码
示例
try:
# 试图打开一个文件并读取
file = open('example.txt', 'r')
content = file.read()
except FileNotFoundError:
# 如果文件不存在,输出错误信息
print("The file was not found.")
except IOError:
# 如果发生I/O错误,输出错误信息
print("Error reading the file.")
else:
# 如果没有异常发生,输出文件内容
print(content)
finally:
# 关闭文件,确保释放资源
if 'file' in locals():
file.close()
如果无法确定异常类型,可以通过继承Exception
类实现。这对于捕获特定应用中的错误非常有用。
异常处理原理
异常传播:当异常在一个代码块中被引发时,Python会立即停止执行该块中后续的代码,并在异常引发的地方寻找“处理程序”。如果找到合适的处理程序,则执行它;否则,异常会向上传播到调用该代码的地方,一直传播到主程序。如果在任何地方都没有捕获该异常,程序会终止并显示错误信息。
这里有一个简单的例子来展示异常的传递:
def function1():
print("Function 1 started")
function2()
print("Function 1 ended")
def function2():
print("Function 2 started")
function3()
print("Function 2 ended")
def function3():
print("Function 3 started")
# 这里引发一个异常
raise ValueError("An error occurred in function 3")
print("Function 3 ended")
try:
function1()
except ValueError as e:
print(f"Caught an exception: {e}")
print("Program continues execution")
在上面的代码中:
function1
调用了function2
。function2
调用了function3
。function3
引发了一个ValueError
。
由于 function3
中的异常没有被那里处理,它会被传播到 function2
,然后传播到 function1
,最后被外部的 try-except
块捕获并处理,在任何一环中捕捉处理都可以避免报错,任何一环都无法捕捉时,程序才会显示错误信息。
关键要点:
- 异常向上传递,直到到达一个处理它的
try-except
块。 - 如果堆栈上的调用中都没有处理异常,程序会终止并输出异常信息。
- 处理异常的
try-except
块可以在任何层次,只要是异常抛出路径的一部分即可。
处理多个异常
在 Python 中处理多个异常可以使用多个 except
块,或者将多个异常类型放在同一个 except
块中。以下是两种方法的示例:
方法一:使用多个 except
块
try:
# 尝试执行的代码
x = int(input("请输入一个数字: "))
y = 1 / x
except ValueError:
print("输入的不是一个有效的数字。")
except ZeroDivisionError:
print("除数不能为零。")
except Exception as e:
print("捕获到一个异常:", e)
方法二:在一个 except
块中捕获多个异常
try:
# 尝试执行的代码
x = int(input("请输入一个数字: "))
y = 1 / x
except (ValueError, ZeroDivisionError) as e:
print("请输入一个不为0有效数字:", e)
except Exception as e:
print("捕获到一个其他异常:", e)
方法三:通配所有异常(不推荐)
虽然这不是一个推荐的做法,但您也可以使用一个 except
块来捕获所有类型的异常。
try:
# 尝试执行的代码
x = int(input("请输入一个数字: "))
y = 1 / x
except Exception as e:
print("捕获到一个异常:", e)
发布者:LJH,转发请注明出处:https://www.ljh.cool/42142.html