📜  Python的断管错误

📅  最后修改于: 2022-05-13 01:54:31.283000             🧑  作者: Mango

Python的断管错误

在这篇文章中,我们将讨论管道错误Python从如何在Python与所需的解决方案类型一起发生错误开始遵循以纠正错误的Python。所以,让我们进入这篇文章来很好地理解这个概念。

随着 IT 领域新兴技术的进步,编程语言的使用发挥着至关重要的作用。因此,为了函数的快速执行,考虑了适当的语言。在这种情况下, Python因其简单性和各种库的可用性而成为满足当前问题执行需求的最重要语言。但是随着执行,执行过程中的错误也随之产生,程序员很难纠正错误以处理问题。

断管错误的出现

损坏的管道错误通常是输入/输出错误,它发生在 Linux 系统级别。该错误发生在文件的读写过程中,主要发生在文件的操作过程中。在 Linux 系统中发生的相同错误是 EPIPE,但是每个返回其错误代码的库函数也会生成一个称为 SIGPIPE 的信号,如果程序没有被处理或阻塞,则该信号用于终止程序。因此,除非程序已处理或阻止 SIGPIPE,否则程序将永远无法看到 EPIPE 错误。

默认情况下, Python解释器不足以忽略 SIGPIPE,而是将此信号转换为异常并引发错误,称为 IOError(INPUT/OUTPUT error),也称为“错误 32”或管道损坏错误。

Python终端中的断管错误

上面编写的管道代码将创建一个向上游发送数据的进程和一个向下游读取数据的进程。但是当下游进程无法读取上游数据时,它会通过向上游进程发送 SIGPIPE 信号来引发异常。因此, Python问题中的上游进程将引发诸如IOError: Broken pipe 错误之类的错误。

例子:

Python3
for i in range(4000):
    print(i)


Python3
from signal import signal, SIGPIPE, SIG_DFL  
signal(SIGPIPE,SIG_DFL)
  
for i in range(4000):
    print(i)


Python3
import sys
import errno
  
try:
    for i in range(4000):
        print(i)
except IOError as e:
    if e.errno == errno.EPIPE:
      pass
       # Handling of the error


当我们从 unix 命令运行这个文件时:

python3 main.py | head -n3000

避免断管错误的步骤

方法一:为了避免报错,我们需要让终端高效的运行代码而不捕捉SIGPIPE信号,所以对于这些,我们可以在Python程序的顶部添加以下代码。

from signal import signal, SIGPIPE, SIG_DFL  
signal(SIGPIPE,SIG_DFL) 

蟒蛇3

from signal import signal, SIGPIPE, SIG_DFL  
signal(SIGPIPE,SIG_DFL)
  
for i in range(4000):
    print(i)

输出:



0
1
20
1
2
3
4
5
6
7
8
9
3
4
5
6
7
8
9

解释:

上面放在Python代码顶部的代码用于将SIGPIPE信号重定向到默认的SIG_DFL信号,系统通常会忽略该信号,以便可以无缝执行代码的其余部分。但是方法11并不有效,因为在信号库的Python手册中提到应该避免这种类型的信号处理,并且不应在代码的任何部分进行实践。因此,出于这个原因,我们将采用第二种方法。

方法二:我们可以使用Python手册中已经认可的try/catch块的功能来处理这种类型的错误,建议按照这样的程序来处理错误。

import sys, errno  
try:  
   # INPUT/OUTPUT operation #
except IOError as e:  
   if e.errno == errno.EPIPE:  
       # Handling of the error  

例子:

蟒蛇3

import sys
import errno
  
try:
    for i in range(4000):
        print(i)
except IOError as e:
    if e.errno == errno.EPIPE:
      pass
       # Handling of the error

输出:

0
1
2
3
4
5
6
7
8
9

解释:

在上面这段代码中,我们使用了Python的内置库,即Sys和Errno模块,并使用try/catch块来捕获引发的SIGPIPE异常并在它停止程序执行之前处理它。