Python 中,`try` 和 `except` 用于异常处理的关键字简介
一、try
和 except
用于异常处理的关键字
在 Python 中,try
和 except
是用于异常处理的关键字。异常处理机制允许程序在遇到错误时能够优雅地处理,而不会导致程序的崩溃。下面详细介绍 try
和 except
的用法。
基本用法
语法
try:
# 可能会引发异常的代码块
pass
except SomeException:
# 异常处理代码块
pass
示例
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以零")
在这个示例中,try
块中的代码尝试执行除以零的操作,这会引发 ZeroDivisionError
异常。except
块捕获到这个异常,并打印一条消息。
捕获多个异常
可以使用多个 except
块来捕获不同类型的异常:
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以零")
except ValueError:
print("值错误")
捕获所有异常
如果不指定异常类型,except
块将捕获所有类型的异常:
try:
result = 10 / 0
except:
print("发生了一个异常")
使用 as
获取异常对象
可以使用 as
关键字获取异常对象,以便在 except
块中访问异常的详细信息:
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"发生异常:{e}")
else
块
else
块在没有发生异常时执行:
try:
result = 10 / 2
except ZeroDivisionError:
print("不能除以零")
else:
print(f"结果是:{result}")
finally
块
finally
块中的代码无论是否发生异常都会执行,常用于清理资源:
try:
result = 10 / 2
except ZeroDivisionError:
print("不能除以零")
else:
print(f"结果是:{result}")
finally:
print("这段代码总是会执行")
综合示例
try:
file = open('example.txt', 'r')
content = file.read()
result = 10 / int(content)
except FileNotFoundError as e:
print(f"文件未找到: {e}")
except ValueError as e:
print(f"值错误: {e}")
except ZeroDivisionError as e:
print(f"不能除以零: {e}")
else:
print(f"结果是:{result}")
finally:
file.close()
print("文件已关闭")
在这个综合示例中:
try
块尝试打开一个文件、读取文件内容并进行除法运算。except
块捕获特定的异常类型,并打印相应的错误消息。else
块在没有异常时执行,打印结果。finally
块总是执行,用于关闭文件。
总结
try
:包含可能引发异常的代码。except
:捕获并处理特定的异常。else
:在没有异常时执行的代码。finally
:无论是否发生异常,始终执行的代码。
通过合理使用 try
、except
、else
和 finally
,可以提高代码的健壮性和容错能力,确保程序在异常情况下也能稳定运行。
二、常见的内置异常
在 Python 中,异常是继承自 BaseException
类的各种错误类型。在使用 except
语句捕获异常时,可以捕获不同类型的异常。常见的异常类型包括但不限于以下几种:
常见的内置异常
-
Exception:
- 基础异常类,所有的内置异常都继承自它。
-
ArithmeticError:
- 所有算术错误的基类。
-
ZeroDivisionError:
- 除数为零时引发的异常。
-
AssertionError:
- 断言语句(
assert
)失败时引发的异常。
- 断言语句(
-
AttributeError:
- 尝试访问未知对象属性时引发的异常。
-
BufferError:
- 与缓冲区相关的操作引发的异常。
-
EOFError:
- 读取文件结束符(EOF)时引发的异常。
-
ImportError:
- 导入模块失败时引发的异常。
-
ModuleNotFoundError:
- 找不到模块时引发的异常(是 ImportError 的子类)。
-
IndexError:
- 序列索引超出范围时引发的异常。
-
KeyError:
- 在字典中查找一个不存在的键时引发的异常。
-
KeyboardInterrupt:
- 用户中断执行(通常是按下
Ctrl+C
)时引发的异常。
- 用户中断执行(通常是按下
-
MemoryError:
- 内存溢出时引发的异常。
-
NameError:
- 尝试访问未定义的变量时引发的异常。
-
UnboundLocalError:
- 访问未绑定到局部变量的对象时引发的异常(是 NameError 的子类)。
-
OSError:
- 操作系统相关的异常,包括文件处理错误等。
-
FileNotFoundError:
- 尝试访问不存在的文件时引发的异常(是 OSError 的子类)。
-
PermissionError:
- 尝试进行没有权限的操作时引发的异常(是 OSError 的子类)。
-
TimeoutError:
- 操作超时时引发的异常(是 OSError 的子类)。
-
OverflowError:
- 数值运算结果超出范围时引发的异常。
-
RecursionError:
- 递归层次超过最大限制时引发的异常。
-
ReferenceError:
- 弱引用试图访问已经垃圾回收的对象时引发的异常。
-
RuntimeError:
- 在检测到不适当的运行时情况时引发的异常。
-
NotImplementedError:
- 在要求派生类实现的抽象方法在基类中调用时引发的异常(是 RuntimeError 的子类)。
-
SyntaxError:
- 语法错误时引发的异常。
-
IndentationError:
- 缩进不正确时引发的异常(是 SyntaxError 的子类)。
-
TabError:
- 使用 Tab 和空格混合进行缩进时引发的异常(是 IndentationError 的子类)。
-
SystemError:
- 解释器内部错误时引发的异常。
-
TypeError:
- 操作或函数应用于不适当类型的对象时引发的异常。
-
ValueError:
- 操作或函数应用于具有正确类型但不正确值的对象时引发的异常。
-
UnicodeError:
- Unicode 相关错误的基类。
-
UnicodeEncodeError:
- Unicode 编码错误时引发的异常(是 UnicodeError 的子类)。
-
UnicodeDecodeError:
- Unicode 解码错误时引发的异常(是 UnicodeError 的子类)。
-
UnicodeTranslateError:
- Unicode 翻译错误时引发的异常(是 UnicodeError 的子类)。
捕获多个异常
可以在 except
语句中捕获多个异常类型:
try:
# 可能会引发异常的代码块
result = 10 / 0
except (ZeroDivisionError, ValueError) as e:
print(f"捕获到异常:{e}")
捕获所有异常
如果不指定异常类型,可以捕获所有异常:
try:
# 可能会引发异常的代码块
result = 10 / 0
except Exception as e:
print(f"捕获到异常:{e}")
示例代码
以下是一个示例,演示了如何捕获和处理多种类型的异常:
try:
# 模拟不同的异常
# result = 10 / 0 # ZeroDivisionError
# result = int("not a number") # ValueError
result = [1, 2, 3][5] # IndexError
except ZeroDivisionError as e:
print(f"不能除以零: {e}")
except ValueError as e:
print(f"值错误: {e}")
except IndexError as e:
print(f"索引超出范围: {e}")
except Exception as e:
print(f"捕获到其他异常: {e}")
总结
except
语句用于捕获和处理在 try
语句块中引发的异常。Python 提供了多种内置异常类型,可以根据需要进行精细化的异常处理。了解并正确使用这些异常类型,可以提高代码的健壮性和可维护性。