Skip to main content
 首页 » 编程设计

python之在 try catch python 中捕获 stderr 自定义输出

2025年05月04日29exmyth

我有一个函数会在发生错误时写入 stderr:

class Scanner: 
    ... 
 
    def next(self): 
       if ... 
            ... 
            if not open_comment_count == closed_comment_count: 
                        ... 
                        sys.stderr.write("error: unclosed comment at position ({0}, {1})".format(start_position, end_position)) 
                        ... 
                        break 
            ... 
 
       else: 
            sys.stderr.write("error: illegal character \'{0}\' found " \ 
                          "at position @({1}, {2})".format(self.input_text[self.curr_position], 
                                                           self.curr_position, self.curr_position)) 
                    error_flag = 1 
                    break 
      if error_flag == 0: 
            token = Token(kind=4, eof_value="eof", start_position=self.curr_position, end_position=self.curr_position) 
            return token 

该函数很长,所以我包含了写入stderr 的部分。我想做的是当这些错误发生时,我想打印这些错误并终止程序。所以总的来说,我想:

def main(): 
    s = Scanner(input_string) 
    try: 
        while(True): 
            s.next() 
    except: 
        # print error message and stop 

我坚持的是异常(exception)应该是什么。我想以某种方式捕捉到某些内容已写入 stderr,我希望在 main 中捕捉并打印出来,然后程序停止。基本上一直运行到异常发生。我知道这可以通过编写我自己的异常来完成,但是是否可以只检查是否有内容写入 stderr 然后打印出来?

请您参考如下方法:

您想做的事情会混淆问题:报告错误会成为一个信号,表明已经发生了错误。您可以通过为设置某种标志的 stderr 创建一个包装器来做到这一点:

import sys 
 
class MyStdErr(object): 
 
    stderr = sys.stderr 
    waserr = False 
 
    def write(self, text): 
        self.waserr = True 
        self.stderr.write(text) 
 
sys.stderr = MyStdErr() 

现在 sys.stderr.waserr 是 True 如果 stderr 在任何时候被写入。

不过,我认为引发包含错误消息的异常、捕获它并打印错误(如 Nathan 所示)要好得多。