【Python-因特网客户端编程-03】Python 中,`try` 和 `except` 用于异常处理的关键字简介

一、tryexcept 用于异常处理的关键字

在 Python 中,tryexcept 是用于异常处理的关键字。异常处理机制允许程序在遇到错误时能够优雅地处理,而不会导致程序的崩溃。下面详细介绍 tryexcept 的用法。

基本用法

语法
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:无论是否发生异常,始终执行的代码。

通过合理使用 tryexceptelsefinally,可以提高代码的健壮性和容错能力,确保程序在异常情况下也能稳定运行。

二、常见的内置异常

在 Python 中,异常是继承自 BaseException 类的各种错误类型。在使用 except 语句捕获异常时,可以捕获不同类型的异常。常见的异常类型包括但不限于以下几种:

常见的内置异常

  1. Exception:

    • 基础异常类,所有的内置异常都继承自它。
  2. ArithmeticError:

    • 所有算术错误的基类。
  3. ZeroDivisionError:

    • 除数为零时引发的异常。
  4. AssertionError:

    • 断言语句(assert)失败时引发的异常。
  5. AttributeError:

    • 尝试访问未知对象属性时引发的异常。
  6. BufferError:

    • 与缓冲区相关的操作引发的异常。
  7. EOFError:

    • 读取文件结束符(EOF)时引发的异常。
  8. ImportError:

    • 导入模块失败时引发的异常。
  9. ModuleNotFoundError:

    • 找不到模块时引发的异常(是 ImportError 的子类)。
  10. IndexError:

    • 序列索引超出范围时引发的异常。
  11. KeyError:

    • 在字典中查找一个不存在的键时引发的异常。
  12. KeyboardInterrupt:

    • 用户中断执行(通常是按下 Ctrl+C)时引发的异常。
  13. MemoryError:

    • 内存溢出时引发的异常。
  14. NameError:

    • 尝试访问未定义的变量时引发的异常。
  15. UnboundLocalError:

    • 访问未绑定到局部变量的对象时引发的异常(是 NameError 的子类)。
  16. OSError:

    • 操作系统相关的异常,包括文件处理错误等。
  17. FileNotFoundError:

    • 尝试访问不存在的文件时引发的异常(是 OSError 的子类)。
  18. PermissionError:

    • 尝试进行没有权限的操作时引发的异常(是 OSError 的子类)。
  19. TimeoutError:

    • 操作超时时引发的异常(是 OSError 的子类)。
  20. OverflowError:

    • 数值运算结果超出范围时引发的异常。
  21. RecursionError:

    • 递归层次超过最大限制时引发的异常。
  22. ReferenceError:

    • 弱引用试图访问已经垃圾回收的对象时引发的异常。
  23. RuntimeError:

    • 在检测到不适当的运行时情况时引发的异常。
  24. NotImplementedError:

    • 在要求派生类实现的抽象方法在基类中调用时引发的异常(是 RuntimeError 的子类)。
  25. SyntaxError:

    • 语法错误时引发的异常。
  26. IndentationError:

    • 缩进不正确时引发的异常(是 SyntaxError 的子类)。
  27. TabError:

    • 使用 Tab 和空格混合进行缩进时引发的异常(是 IndentationError 的子类)。
  28. SystemError:

    • 解释器内部错误时引发的异常。
  29. TypeError:

    • 操作或函数应用于不适当类型的对象时引发的异常。
  30. ValueError:

    • 操作或函数应用于具有正确类型但不正确值的对象时引发的异常。
  31. UnicodeError:

    • Unicode 相关错误的基类。
  32. UnicodeEncodeError:

    • Unicode 编码错误时引发的异常(是 UnicodeError 的子类)。
  33. UnicodeDecodeError:

    • Unicode 解码错误时引发的异常(是 UnicodeError 的子类)。
  34. 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 提供了多种内置异常类型,可以根据需要进行精细化的异常处理。了解并正确使用这些异常类型,可以提高代码的健壮性和可维护性。

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Go-Back-N协议是一种流水线协议,它允许发送方在不等待确认的情况下发送多个数据包。这种协议主要用于在不可靠的网络环境实现可靠数据传输。下面是一个基于Go-Back-N的可靠数据传输软件的python实现。 发送客户端: ```python import socket # 配置发送方参数 UDP_IP = "127.0.0.1" UDP_PORT = 5005 MESSAGE = "Hello, World!" # 设置序列号 sequence_number = 0 # 创建套接字 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP # 发送数据 while True: # 发送数据包 sock.sendto(str(sequence_number) + MESSAGE, (UDP_IP, UDP_PORT)) # 等待ACK try: sock.settimeout(1.0) data, addr = sock.recvfrom(1024) if data == str(sequence_number): print("Received ACK for packet", sequence_number) sequence_number += 1 except socket.timeout: print("Timeout. Resending packet", sequence_number) ``` 接收客户端: ```python import socket # 配置接收方参数 UDP_IP = "127.0.0.1" UDP_PORT = 5005 # 设置期望的序列号 expected_sequence_number = 0 # 创建套接字 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP # 绑定套接字 sock.bind((UDP_IP, UDP_PORT)) # 接收数据 while True: data, addr = sock.recvfrom(1024) # 缓冲区大小为1024字节 packet_sequence_number = int(data[:1]) if packet_sequence_number == expected_sequence_number: print("Received packet", packet_sequence_number) # 发送ACK sock.sendto(str(packet_sequence_number), addr) expected_sequence_number += 1 else: print("Discarding out-of-order packet", packet_sequence_number) ``` 需要注意的是,在实际应用,需要添加一些额外的机制来处理超时、丢包和重复包等情况,以保证数据传输的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿寻寻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值