即使已经捕获了CalledProcessError,但在Apache上仍会导致500错误。

3

在运行我的Django项目时,我遇到了一个关于subprocess.CalledProcessError的奇怪问题,这是在一个运行Apache的生产服务器上:

我的代码(更新:添加了catch-all-exception处理 - 行为没有改变)如下:

try:
    command_string = 'gcc -O0 -g3 -Wall -c -fmessage-length=0 ' + cfile + ' -o ' + ofile
    compile_result = subprocess.check_output(command_string,stderr=subprocess.STDOUT,shell=True)
    #logger.warning(compile_result)
    if compile_result != "": #Dann gab es einen Fehler bzw. ein Compiler-Warning --> Abbruch!
        self.ausgabe = u"Compile:\n"
        self.ausgabe += unicode(compile_result, "utf-8")
        return
except subprocess.CalledProcessError as e:
    self.ausgabe = u"Compilierfehler (Returncode {0}):\n".format(e.returncode)
    self.ausgabe += unicode(e.output, "utf-8")
    logger.error("CPE" + unicode(e.returncode, "utf-8") + unicode(e.output, "utf-8"))
    return #die weiteren Schritte müssen gar nicht erst ausgeführt werden...
except:
    logger.error(str(sys.exc_info()))
    self.ausgabe = u"Compilieren nicht erfolgreich. Fehler:\n" + unicode(sys.exc_info(), "utf-8") 
    return

当我在我的Windows开发机和djange测试服务器上运行它时,所有的工作都符合预期。当命令执行失败时,异常被捕获,错误处理也按预期工作。
将代码移动到我的生产服务器(ubuntu,apache)时,当命令执行失败时,会出现“内部服务器错误500”,这不是期望的行为。Apache错误日志并不是很有用,因为它没有显示任何错误。
我的配置是: Apache/2.2.22(Ubuntu)PHP/5.4.9-4ubuntu2.3 mod_wsgi/3.4 Python/2.7.4
(是的,我重新启动了Apache,并确信我运行的是相同的代码。)
对此有什么想法吗?

1
如果全捕获异常处理未能捕获此异常,则可能是您未运行此代码,或者生产环境中的异常发生在try块之外。500甚至可能是由于完全不属于Python的错误引起的。 - Martijn Pieters
2
在这段代码中故意引入一个错误,看看生产环境中是否出现了行为变化。至少这样可以排除运行过时代码的可能性。 - Martijn Pieters
感谢@MartijnPieters!我引入了一个ZeroDevisionError,- tadaa-相同的行为。这启发我从不同的角度检查我的异常处理 - 简而言之,另一个编码问题被发现。我将在回答中详细解释。 - OBu
顺便问一下:现在是否可以结束悬赏并将50点捐赠给@MartijnPieters? - OBu
我需要发布一个答案,然后您可以将赏金授予该答案。我已经将我的评论重新发布为答案,以防您想这样做。 :-) - Martijn Pieters
2个回答

3

如果全捕获异常处理程序没有捕获到这个异常,那么要么你没有运行此代码,要么生产环境中的异常发生在try块之外。500甚至可能是由于Python之外的错误导致的。

在此代码段中引入一个故意的错误,看看是否在生产环境中看到行为变化。这至少可以排除运行过时代码的可能性。


感谢您将其重新发布为答案!尽管完整的解决方案在我的下面的答案中找到了(因此,如果有人遇到类似的问题-向下滚动一点),但我将其视为“已接受”,因为它帮助我找到了解决方案。 - OBu
在通用情况下,我的答案仍然是正确的;你的问题出在try块之外的异常上。 - Martijn Pieters

2
感谢Martijn Pieters的评论和问题,我发现了一些错误导致了奇怪的行为:
  • except subprocess.CalledProcessError as e:部分包含了一些Unicode转换,这在系统a上运行良好,在系统b上会出现问题。因此,在我的异常处理中引发了一个UnicodeConversionError,并导致500错误,因为它没有被捕获。

  • 发布的代码中的另一个问题是,unicode(sys.exc_info(), "utf-8")也会引发异常,因为sys.exc_info()返回一个元组,当使用str()方法进行正确的转换为字符串时,但unicode()只能处理字符串而不能处理元组。一个解决方法是使用unicode(str(...))

感谢所有花时间解决这个问题的人!

没错,这意味着异常确实在 try 块之外。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接