ZetCode

Python os.strerror 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨了 Python 的 os.strerror 函数,该函数将系统错误编号转换为人类可读的消息。我们将介绍错误代码处理、平台差异和实际用法示例。

基本定义

os.strerror 函数将系统错误代码转换为可读的字符串。它对于解释系统调用的 errno 值非常有用。

关键参数:errno(整数错误代码)。返回相应的错误消息字符串。 这些消息依赖于平台,并且可能因系统而异。

基本错误代码转换

os.strerror 最简单的用法是将数字错误代码转换为其描述性消息。 这有助于使系统错误更易于理解。

basic_translation.py
import os

# Common error codes
error_codes = [1, 2, 13, 17, 24]

for code in error_codes:
    message = os.strerror(code)
    print(f"Error {code}: {message}")

# Example output on Linux:
# Error 1: Operation not permitted
# Error 2: No such file or directory
# Error 13: Permission denied
# Error 17: File exists
# Error 24: Too many open files

此示例显示了数字错误代码如何转换为人类可读的消息。确切的消息可能因操作系统而异。

该函数在处理返回数字错误代码的底层系统调用时特别有用。

处理文件操作错误

os.strerror 可以通过解释来自 OSError 等异常的错误代码,来帮助解释文件操作失败的原因。

file_errors.py
import os

def read_file(filename):
    try:
        with open(filename) as f:
            return f.read()
    except OSError as e:
        error_msg = os.strerror(e.errno)
        print(f"Failed to read {filename}: {error_msg}")
        return None

# Test with non-existent file
read_file("nonexistent.txt")

# Test with permission-denied file
read_file("/root/.bashrc")

此示例演示了如何捕获 OSError 并使用 os.strerror 来清楚地解释文件操作出错的原因。

错误消息帮助用户了解问题是缺少文件、权限问题还是其他系统错误。

使用 errno 常量

Python 的 errno 模块为错误代码提供符号名称,使其与 os.strerror 结合使用时代码更具可读性。

errno_constants.py
import os
import errno

def check_file_access(filename):
    try:
        with open(filename) as f:
            print(f"Successfully opened {filename}")
    except OSError as e:
        if e.errno == errno.ENOENT:
            msg = os.strerror(errno.ENOENT)
            print(f"File not found: {msg}")
        elif e.errno == errno.EACCES:
            msg = os.strerror(errno.EACCES)
            print(f"Permission denied: {msg}")
        else:
            print(f"Unknown error: {os.strerror(e.errno)}")

check_file_access("missing.txt")
check_file_access("/protected/file")

此示例使用 errno 常量(ENOENT、EACCES)来实现更具可读性的错误处理,并结合 os.strerror 来提供用户友好的消息。

符号常量使代码更易于维护并且可以在不同的平台上移植。

平台特定的错误消息

错误消息在操作系统之间有所不同。 此示例演示了 os.strerror 如何在不同的平台上返回不同的字符串。

platform_differences.py
import os
import sys

error_code = 2  # No such file or directory

print(f"Platform: {sys.platform}")
print(f"Error message: {os.strerror(error_code)}")

# Sample outputs:
# On Linux: "No such file or directory"
# On Windows: "The system cannot find the file specified"
# On macOS: "No such file or directory"

这个简单的脚本显示了相同的错误代码 (2) 如何在不同的操作系统上产生不同的消息。

在编写跨平台代码时,请注意错误消息可能需要为不同系统上的用户提供额外的上下文。

自定义错误处理包装器

我们可以创建一个辅助函数,将 os.strerror 与异常处理相结合,以便在整个应用程序中进行更清晰的错误报告。

error_wrapper.py
import os

def get_error_message(error):
    """Return formatted error message from exception or error code"""
    if isinstance(error, OSError):
        return os.strerror(error.errno)
    elif isinstance(error, int):
        return os.strerror(error)
    else:
        return str(error)

# Usage examples:
try:
    with open("missing.txt") as f:
        pass
except OSError as e:
    print(f"Error: {get_error_message(e)}")

# Can also use with raw error codes
print(f"Error 13: {get_error_message(13)}")

这个包装函数通过接受异常或原始错误代码并返回一致的字符串消息,简化了错误消息处理。

此类实用程序有助于在大型代码库中维护一致的错误报告。

列出所有系统错误消息

虽然不建议用于生产环境,但我们可以探索当前系统上所有已知的错误代码及其消息。

list_all_errors.py
import os

def list_error_messages(max_code=100):
    """Display all error messages up to max_code"""
    print("System error messages:")
    print("======================")
    
    for code in range(max_code + 1):
        try:
            msg = os.strerror(code)
            print(f"{code:3d}: {msg}")
        except ValueError:
            pass  # Skip invalid error codes

list_error_messages()

# Note: The range of valid error codes varies by system
# Some codes may be undefined or have no message

此脚本尝试显示最大指定范围内的所有错误代码的消息。并非所有代码都具有有效的消息。

输出提供了对当前平台上支持的错误代码范围和消息的深入了解。

处理未知错误代码

在处理来自外部来源的错误代码时,我们需要处理代码可能无效或系统未知的情况。

unknown_errors.py
import os

def safe_strerror(code):
    """Get error message or default if code is invalid"""
    try:
        return os.strerror(code)
    except (ValueError, TypeError):
        return f"Unknown error code: {code}"

# Test with valid and invalid codes
print(safe_strerror(2))      # Valid code
print(safe_strerror(9999))   # Invalid code
print(safe_strerror("abc"))  # Wrong type

# Output depends on system:
# Valid: "No such file or directory"
# Invalid: "Unknown error code: 9999"
# Wrong type: "Unknown error code: abc"

此示例显示了一种防御性的错误消息转换方法,不会引发无效输入的异常。

包装函数确保应用程序可以优雅地处理可能遇到的任何错误代码。

安全注意事项

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程