【雕爷学编程】MicroPython手册之内置模块 uerrno-错误码模块

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述
MicroPython的内置模块uerrno是一个提供对OSError异常的符号错误代码的访问的模块。它的主要特点是:

1、它基于ANSI C/POSIX标准,所有的错误代码都以“E”开头,如EEXIST, EAGAIN等。
2、它的错误代码的清单取决于MicroPython的端口,不同的端口可能支持不同的错误代码。
3、它提供了一个errorcode字典,用于将数值错误代码映射到符号错误代码的字符串。

uerrno模块的应用场景是:

1、当需要处理OSError异常时,可以使用uerrno模块来获取和判断错误代码,从而采取相应的措施。
2、当需要显示或记录OSError异常时,可以使用uerrno模块来获取和转换错误代码,从而提高可读性和便利性。

uerrno模块的注意事项是:

1、在使用uerrno模块之前,需要导入它,如import uerrno。
2、在访问OSError异常的错误代码时,需要使用exc.args[0]而不是exc.errno,因为MicroPython中OSError异常只有一个参数。
3、在比较或转换错误代码时,需要使用uerrno模块中定义的常量或字典,而不是直接使用数值或字符串,以避免不一致或错误。

uerrno模块的三个实际运用程序案例是:

案例一:创建一个目录,如果目录已存在,则打印提示信息,否则打印成功信息。

import uos
import uerrno

try:
    uos.mkdir("my_dir")
    print("Directory created successfully")
except OSError as exc:
    if exc.args[0] == uerrno.EEXIST:
        print("Directory already exists")
    else:
        print("Error:", uerrno.errorcode[exc.args[0]])

案例二:打开一个文件,如果文件不存在,则创建一个新文件并写入一些内容,否则打印提示信息。

import uio
import uerrno

try:
    f = uio.open("my_file.txt", "r")
    print("File already exists")
    f.close()
except OSError as exc:
    if exc.args[0] == uerrno.ENOENT:
        print("File not found, creating a new one")
        f = uio.open("my_file.txt", "w")
        f.write("Hello, MicroPython!")
        f.close()
    else:
        print("Error:", uerrno.errorcode[exc.args[0]])

案例三:连接一个网络套接字,如果连接超时,则重试一次,否则打印错误信息。

import usocket
import uerrno

s = usocket.socket()
address = ("example.com", 80)
retry = False

try:
    s.connect(address)
    print("Connection established")
except OSError as exc:
    if exc.args[0] == uerrno.ETIMEDOUT:
        print("Connection timed out")
        if not retry:
            print("Retrying...")
            retry = True
            s.connect(address)
        else:
            print("Retry failed")
    else:
        print("Error:", uerrno.errorcode[exc.args[0]])

案例四:检查文件是否存在:

import uerrno
import os

# 检查文件是否存在
filename = 'myfile.txt'
if not os.path.exists(filename):
    print("File does not exist")
    errno = uerrno.errorcode.get(uerrno.ENOENT, "Unknown error")
    print("Error:", errno)

在这个示例中,我们使用os模块的exists()函数检查指定的文件是否存在。如果文件不存在,我们打印出相应的错误消息,并使用uerrno模块的errorcode字典获取ENOENT错误码对应的错误信息。

案例五:打开文件并处理错误:

import uerrno

# 打开文件并处理错误
try:
    file = open('myfile.txt', 'r')
except OSError as e:
    errno = e.args[0]
    error_message = uerrno.errorcode.get(errno, "Unknown error")
    print("Error:", error_message)

在这个示例中,我们尝试打开一个文件 ‘myfile.txt’,并使用try-except结构来捕捉OSError异常。如果打开文件时发生错误,我们获取错误码并使用uerrno模块的errorcode字典获取对应的错误信息。

案例六:处理传输错误:

import uerrno

# 处理传输错误
try:
    # Perform network data transfer
    # ...
    # Simulating a connection error
    raise OSError(uerrno.ECONNRESET, "Connection reset by peer")
except OSError as e:
    errno = e.args[0]
    if errno == uerrno.ECONNRESET:
        print("Connection reset by peer")
    else:
        error_message = uerrno.errorcode.get(errno, "Unknown error")
        print("Error:", error_message)

在这个示例中,我们使用try-except结构来捕捉OSError异常,在网络数据传输过程中,通过模拟连接错误来触发异常。我们检查错误码是否为ECONNRESET,如果是,则打印出相应的错误消息。否则,我们使用uerrno模块的errorcode字典获取对应的错误信息。

案例七:检查文件是否存在2

import uos
import uerrno

# 检查文件是否存在
try:
    uos.stat("myfile.txt")
except OSError as e:
    if e.args[0] == uerrno.ENOENT:
        print("文件不存在")

在这个例子中,我们使用 uos.stat() 函数检查文件 “myfile.txt” 是否存在。如果文件不存在,会引发 OSError 异常,并且可以通过 uerrno.ENOENT 错误码来判断文件是否存在。

案例八:处理文件读写错误

import uos
import uerrno

# 打开文件并进行读取操作
try:
    file = open("myfile.txt", "r")
    data = file.read()
    file.close()
except OSError as e:
    if e.args[0] == uerrno.EACCES:
        print("文件访问被拒绝")
    elif e.args[0] == uerrno.ENOENT:
        print("文件不存在")
    else:
        print("其他文件读写错误")

在这个例子中,我们打开文件 “myfile.txt” 并进行读取操作。如果在打开或读取文件时发生错误,会引发 OSError 异常,并根据不同的错误码进行相应的处理,如 uerrno.EACCES 表示文件访问被拒绝,uerrno.ENOENT 表示文件不存在。

案例九: 获取最近一次错误码

import uos
import uerrno

# 进行一些操作...
# ...

# 获取最近一次错误码
error_code = uos.errno()
if error_code == uerrno.ENOMEM:
    print("内存不足")
elif error_code == uerrno.EINVAL:
    print("无效的参数")
else:
    print("其他错误")

在这个例子中,我们进行一些操作后,通过 uos.errno() 函数获取最近一次的错误码,并根据错误码进行相应的处理。这样,我们可以根据错误码来确定发生了哪种类型的错误。

这些案例展示了 uerrno 模块的实际应用,包括检查文件是否存在、处理文件读写错误以及获取最近一次的错误码。通过使用 uerrno 模块,你可以在 MicroPython 设备上处理和识别不同类型的错误,以便进行相应的错误处理和调试。请注意,在使用 uerrno 模块时,请参考 MicroPython 的文档以了解特定错误码的含义和用法。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值