以下是 Python 中部分常见错误编号及其对应的含义汇总:
一、文件操作相关错误编号
errno.ENOENT
(2): 表示文件或目录不存在。
import errno
print(f"文件或目录不存在的错误编号:{errno.ENOENT}")
errno.EACCES
(13): 表示权限被拒绝,无法访问文件或目录。
import errno
print(f"权限被拒绝的错误编号:{errno.EACCES}")
errno.EEXIST
(17): 表示文件或目录已存在,通常在创建文件或目录时,如果同名文件或目录已经存在会引发此错误。
import errno
print(f"文件或目录已存在的错误编号:{errno.EEXIST}")
二、网络操作相关错误编号
errno.ECONNREFUSED
(111): 表示连接被拒绝,例如尝试连接到一个没有监听服务的端口。
import errno
print(f"连接被拒绝的错误编号:{errno.ECONNREFUSED}")
errno.ETIMEDOUT
(110): 表示连接超时,在尝试建立网络连接时,如果超过一定时间未连接成功会引发此错误。
import errno
print(f"连接超时的错误编号:{errno.ETIMEDOUT}")
errno.EADDRINUSE
(98): 表示地址已在使用中,通常在尝试绑定到一个已经被使用的端口或地址时会引发此错误。
import errno
print(f"地址已在使用中的错误编号:{errno.EADDRINUSE}")
三、进程和信号相关错误编号
errno.ECHILD
(10): 表示没有子进程,例如在wait
或waitpid
操作中没有子进程可等待。
import errno
print(f"没有子进程的错误编号:{errno.ECHILD}")
errno.EINTR
(4): 表示被中断的系统调用,例如在执行系统调用时收到信号导致中断。
import errno
print(f"被中断的系统调用的错误编号:{errno.EINTR}")
四、内存相关错误编号
errno.ENOMEM
(12): 表示内存不足,例如在分配内存时无法满足请求的内存大小。
import errno
print(f"内存不足的错误编号:{errno.ENOMEM}")
五、输入输出操作相关错误编号
errno.EBADF
(9): 表示错误的文件描述符,例如使用了一个无效的文件描述符进行操作。
import errno
print(f"错误的文件描述符的错误编号:{errno.EBADF}")
errno.EIO
(5): 表示输入输出错误,通常发生在文件读写过程中出现的硬件错误或其他错误。
import errno
print(f"输入输出错误的错误编号:{errno.EIO}")
六、参数错误相关错误编号
errno.EINVAL
(22): 表示无效的参数,例如传递给函数的参数不符合函数的要求。
import errno
print(f"无效参数的错误编号:{errno.EINVAL}")
七、其他错误编号
errno.ESPIPE
(29): 表示非法的查找操作,例如在管道或套接字上执行不允许的查找操作。
import errno
print(f"非法查找操作的错误编号:{errno.ESPIPE}")
在实际应用中,可以使用 errno
模块来捕获和处理相应的错误:
import os
import errno
try:
# 这里进行可能引发错误的操作,如文件操作、网络操作等
pass
except OSError as e:
if e.errno == errno.ENOENT:
print("文件或目录不存在")
elif e.errno == errno.EACCES:
print("权限被拒绝")
else:
print(f"发生错误,错误编号: {e.errno},错误信息: {e.strerror}")
代码解释:
- 首先,导入了
os
和errno
模块。 os
模块提供了许多与操作系统交互的功能,如文件和目录操作、进程管理等。errno
模块提供了系统错误码的符号名称,方便开发者使用和理解错误信息。try-except
结构:try
块:这里包含了可能会引发错误的操作,但目前pass
语句表示该部分暂时没有实际操作,你可以在try
块中添加诸如文件操作(如打开、读取、写入文件)或网络操作(如连接服务器、发送数据)等可能出现异常的代码。except OSError as e
:OSError
是一个异常类,当发生与操作系统相关的错误时会引发此异常。例如,文件操作中的文件不存在、权限问题,或者网络操作中的连接失败等。e
是捕获到的异常对象。e.errno
存储了错误编号,通过将其与errno
模块中的错误编号进行比较,可以判断具体的错误类型。if e.errno == errno.ENOENT
:检查错误编号是否为errno.ENOENT
,如果是,则表示文件或目录不存在,会打印"文件或目录不存在"
。if e.errno == errno.EACCES
:检查错误编号是否为errno.EACCES
,如果是,则表示权限被拒绝,会打印"权限被拒绝"
。else
部分:如果错误编号不是上述两种情况,则打印更通用的错误信息,包括错误编号(e.errno
)和错误信息(e.strerror
)。e.strerror
是根据错误编号生成的错误信息字符串。
使用示例:
以下是在 try
块中添加具体文件操作的示例:
import errno #导入 errno 模块,以便在异常处理中使用错误编号
try:
with open('nonexistent_file.txt', 'r') as file: #尝试以只读模式打开 nonexistent_file.txt 文件
content = file.read() #读取文件的全部内容
print(content) #将读取的内容打印出来
except FileNotFoundError: #捕获 FileNotFoundError 异常
print("文件或目录不存在")
except PermissionError: #捕获 FileNotFoundError 异常
print("权限被拒绝")
except Exception as e: #作为一个通用的异常捕获
print(f"发生错误,错误编号: {e.errno if hasattr(e, 'errno') else None},错误信息: {e}") #尝试获取异常的错误编号,如果异常对象有 errno 属性则获取,否则为 None。e:存储异常对象,打印异常信息
代码解释:
import errno:导入 errno 模块,以便在异常处理中使用错误编号。
try 语句块:
with open(‘nonexistent_file.txt’, ‘r’) as file:尝试以只读模式打开 nonexistent_file.txt 文件。
content = file.read():读取文件的全部内容。
print(content):将读取的内容打印出来。
except FileNotFoundError:当文件不存在时,捕获 FileNotFoundError 异常,并打印 “文件或目录不存在”。
except PermissionError:当没有权限打开文件时,捕获 PermissionError 异常,并打印 “权限被拒绝”。
except Exception as e:作为一个通用的异常捕获,用于捕获其他未预料到的异常。
e.errno if hasattr(e, ‘errno’) else None:尝试获取异常的错误编号,如果异常对象有 errno 属性则获取,否则为 None。
e:存储异常对象,打印异常信息。
使用说明:
确保文件 nonexistent_file.txt 存在且有读取权限,否则会触发相应的异常处理。
可以将 nonexistent_file.txt 替换为你实际想要操作的文件路径。
此代码结构可以帮助你更好地处理文件操作中可能出现的各种异常情况,使程序更加健壮。
在上述示例中:
- 尝试打开一个名为
nonexistent_file.txt
的文件进行读取操作。 - 如果该文件不存在,会引发
OSError
异常,并且e.errno
可能等于errno.ENOENT
,程序将打印"文件或目录不存在"
。
添加网络操作示例:
以下是在 try
块中添加网络操作的示例:
import socket
import errno
import os
try:
# 尝试连接到一个不可达的服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.0.2.1", 8080))
except OSError as e:
if e.errno == errno.ECONNREFUSED:
print("连接被拒绝")
elif e.errno == errno.ETIMEDOUT:
print("连接超时")
elif e.errno == errno.ENOENT:
print("文件或目录不存在")
elif e.errno == errno.EACCES:
print("权限被拒绝")
else:
print(f"发生错误,错误编号: {e.errno},错误信息: {e.strerror}")
在上述示例中:
- 创建了一个 TCP 套接字,并尝试连接到 IP 地址为
192.0.2.1
,端口为8080
的服务器。 - 如果连接被拒绝,会引发
OSError
异常,并且e.errno
可能等于errno.ECONNREFUSED
,程序将打印"连接被拒绝"
。 - 同时,也包含了对文件操作中可能出现的
errno.ENOENT
和errno.EACCES
的检查,因为OSError
也可能是文件操作引发的。
代码优化:
- 可以根据具体的操作场景细化异常处理,例如对于文件操作和网络操作,分别使用不同的
except
子句,以便更准确地捕获和处理异常。
import os
import errno
import socket
def file_operation():
try:
# 尝试打开一个不存在的文件
with open('nonexistent_file.txt', 'r') as file:
content = file.read()
except OSError as e:
if e.errno == errno.ENOENT:
print("文件或目录不存在")
elif e.errno == errno.EACCES:
print("权限被拒绝")
else:
print(f"文件操作发生错误,错误编号: {e.errno},错误信息: {e.strerror}")
def network_operation():
try:
# 尝试连接到一个不可达的服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.0.2.1", 8080))
except OSError as e:
if e.errno == errno.ECONNREFUSED:
print("网络连接被拒绝")
elif e.errno == errno.ETIMEDOUT:
print("网络连接超时")
else:
print(f"网络操作发生错误,错误编号: {e.errno},错误信息: {e.strerror}")
if __name__ == "__main__":
file_operation()
network_operation()
在优化后的代码中:
- 分别定义了
file_operation
和network_operation
函数,用于文件操作和网络操作。 - 在每个函数中,根据操作的特点进行更具针对性的异常处理。
注意事项:
可以根据实际情况添加更多的错误检查和处理逻辑,以提高程序的健壮性。
在上述代码中:
确保在运行代码前,对于文件操作,文件是否存在或权限是否正确;对于网络操作,目标服务器是否可达、端口是否开放等。
- 当发生
OSError
时,通过e.errno
来获取错误编号,并根据不同的错误编号采取不同的处理方式。 e.strerror
可以获取相应的错误描述,以便更清晰地了解错误信息。
这些错误编号通常与操作系统的错误编号相关联,在不同的操作系统上可能会有细微的差别,但大多数情况下,这些常见的错误编号及其含义是相似的。使用这些错误编号可以帮助你更准确地定位和处理程序中出现的问题,提高程序的稳定性和可靠性。
请注意,errno
模块中包含了更多的错误编号,这里仅列举了一些较为常见的,在遇到不同的错误时,可以查阅 Python 官方文档或操作系统的相关文档,以获取更详细的信息。