目录
1.try... except 结构
try except 是最常见的异常处理结构。结构如下:
try: # 可能会引发异常的代码块 result = 10 / 0 except ExceptionType as e: # 处理异常的代码块 print(f"发生了异常: {e}")
try
块:包含可能会引发异常的代码。如果在try
块中的代码引发了异常,Python 会跳过try
块中余下的代码,直接执行except
块。
except
块:用于捕捉和处理异常。你可以指定要捕获的异常类型,也可以捕获所有异常类型。as e
用于获取异常实例,并可以访问异常消息或其他信息。执行的时候,如果try块中没有引发异常,则跳过except块继续执行后续代码.
执行的时候,如果try块中发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常,异常处理完后,继续执行后续代码。
2. try... 多个except结构
try
块配合多个except
块可以处理不同类型的异常。每个except
块负责处理特定类型的异常。try: # 可能会引发异常的代码 result = int("not_a_number") except ValueError as ve: # 处理 ValueError 异常 print(f"值错误: {ve}") except ZeroDivisionError as zde: # 处理 ZeroDivisionError 异常 print(f"除零错误: {zde}") except FileNotFoundError as fnfe: # 处理 FileNotFoundError 异常 print(f"文件未找到: {fnfe}") except Exception as e: # 捕获其他所有异常 print(f"其他异常: {e}")
具体到通用:将最具体的异常类型放在前面,更通用的异常类型放在后面。这确保特定的异常类型能被准确处理。
顺序重要:
except
块的顺序是重要的。Python 按顺序检查except
块,从上到下。如果上面的块能处理异常,下面的块将不会执行。通用异常:
Exception
用于捕获所有其他异常,但最好先捕获已知的具体异常。如下例子:
try: value = int(input("请输入一个整数: ")) result = 10 / value except ValueError as ve: print(f"输入无效: {ve}") except ZeroDivisionError as zde: print(f"不能除以零: {zde}") except Exception as e: print(f"发生了一个错误: {e}") else: print(f"计算结果是: {result}") finally: print("结束处理")
ValueError
处理输入转换错误,ZeroDivisionError
处理除零错误,Exception
捕获所有其他未特定处理的异常。else
块在没有异常时执行,finally
块在try
和except
块之后总是执行。3. try...except...else结构
try...except...else
结构用于更精确地控制异常处理和正常执行的代码块。else
块是在try
块中的代码没有引发异常时执行的。这个结构可以帮助你在没有异常的情况下执行特定的代码,从而提高代码的清晰度和可维护性。try: # 可能会引发异常的代码 result = 10 / int(input("请输入一个整数: ")) except ZeroDivisionError as zde: # 处理 ZeroDivisionError 异常 print(f"除零错误: {zde}") except ValueError as ve: # 处理 ValueError 异常 print(f"输入错误: {ve}") else: # 没有异常时执行的代码 print(f"计算结果是: {result}") finally: # 无论是否发生异常都会执行的代码(可选) print("处理结束")
else
块:在try
块中的代码没有引发异常时执行。else
块用于执行那些在没有异常的情况下需要运行的代码。它不会被执行到except
块处理完所有异常之后才会执行。4. try...except...finally结构
try...except...finally
结构用于在处理异常时确保某些代码始终被执行。这种结构的关键在于finally
块,它会在try
块和except
块执行完毕之后总是被执行,无论是否发生异常。它通常用于资源管理和清理工作,确保即使在发生异常的情况下也能完成必要的清理操作。通常用来释放
try
块中申请的资源try: # 尝试打开文件并读取内容 file = open("example.txt", "r") content = file.read() print(content) except FileNotFoundError as e: # 处理文件未找到的异常 print(f"文件未找到: {e}") except IOError as e: # 处理其他 I/O 错误 print(f"文件读取错误: {e}") finally: # 确保文件始终被关闭 try: file.close() except NameError: # 如果文件打开失败,file 变量可能没有被定义 pass print("文件处理完毕")
finally
块:无论是否发生异常,finally
块中的代码都会被执行。这常用于清理资源(如关闭文件、释放锁或关闭数据库连接),确保这些操作总是被执行。5. return语句和异常处理问题
return
语句用于从函数中返回值并结束函数的执行。异常处理则用于捕获和处理运行时错误,防止程序崩溃。return
语句与异常处理的交互可以影响函数的行为,特别是当异常发生时。由于return有两种作用:结束方法运行、返回值。我们一般不把return放到异常处理结构中,而是放到方法最后.
5.1 异常处理前的
return
如果函数在执行过程中遇到异常,
return
语句在异常被捕获之前不会被执行。def safe_divide(x, y): try: return x / y except ZeroDivisionError: return "Cannot divide by zero."
5.2异常处理后的
return
except
块可以在捕获异常后使用return
语句返回特定值。finally
块中的代码也可以使用return
,但它会覆盖之前的return
。def func(x): try: if x < 0: raise ValueError("Negative value") return x * 2 except ValueError: return "Invalid input" finally: print("Cleanup code") # 总会执行
5.3 finally
块中的return
except
块可以在捕获异常后使用return
语句返回特定值。finally
块中的代码也可以使用return
,但它会覆盖之前的return
def example(): try: return 1 finally: return 2 # 覆盖前面的 return
def process_value(x): try: if x < 0: raise ValueError("Negative value not allowed.") return x * 10 except ValueError as e: return f"Error: {e}" finally: print("Finished processing.") # 使用示例 print(process_value(5)) # 输出: 50 print(process_value(-1)) # 输出: Error: Negative value not allowed.
6.常见的异常
异常名称
说明
ArithmeticError
所有数值计算错误的基类
AssertionError
断言语句失败
AttributeError
对象没有这个属性
BaseException
所有异常的基类
DeprecationWarning
关于被弃用的特征的警告
EnvironmentError
操作系统错误的基类
EOFError
没有内建输入,到达EOF 标记
Exception
常规错误的基类
FloatingPointError
浮点计算错误
FutureWarning
关于构造将来语义会有改变的警告
GeneratorExit
生成器(generator)发生异常来通知退出
ImportError
导入模块/对象失败
IndentationError
缩进错误
IndexError
序列中没有此索引(index)
IOError
输入/输出操作失败
KeyboardInterrupt
用户中断执行(通常是输入^C)
KeyError
映射中没有这个键
LookupError
无效数据查询的基类
MemoryError
内存溢出错误(对于Python 解释器不是致命的)
NameError
未声明/初始化对象 (没有属性)
NotImplementedError
尚未实现的方法
OSError
操作系统错误
OverflowError
数值运算超出最大限制
OverflowWarning
旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning
关于特性将会被废弃的警告
ReferenceError
弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError
一般的运行时错误
RuntimeWarning
可疑的运行时行为(runtime behavior)的警告
StandardError
所有的内建标准异常的基类
StopIteration
迭代器没有更多的值
异常名称
说明
SyntaxError
Python 语法错误
SyntaxWarning
可疑的语法的警告
SystemError
一般的解释器系统错误
SystemExit
解释器请求退出
TabError
Tab 和空格混用
TypeError
对类型无效的操作
UnboundLocalError
访问未初始化的本地变量
UnicodeDecodeError
Unicode 解码时的错误
UnicodeEncodeError
Unicode 编码时错误
UnicodeError
Unicode 相关的错误
UnicodeTranslateError
Unicode 转换时错误
UserWarning
用户代码生成的警告
ValueError
传入无效的参数
Warning
警告的基类
WindowsError
系统调用失败
ZeroDivisionError
除(或取模)零 (所有数据类型)