对于apache,CalledProcessError会导致500错误,即使它被捕获(或应该被捕获)

时间:2013-10-14 07:59:32

标签: python django apache subprocess

在运行Apache的生产服务器上运行我的Django项目时,subprocess.CalledProcessError出现了一个奇怪的问题:

我的代码(更新:添加了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 testserver上运行它时,这一切都按预期工作。在命令执行失败时捕获异常,错误处理按预期工作。

当我将代码移动到我的生产服务器(ubuntu,apache)时,当命令执行失败时,我得到“内部服务器错误500”,这不是所需的行为。 apache error.log不是很有用,因为它没有显示任何错误。

我的配置是: Apache / 2.2.22(Ubuntu)PHP / 5.4.9-4ubuntu2.3 mod_wsgi / 3.4 Python / 2.7.4

(是的,我重新启动了apache,我确信我运行相同的代码)。

关于这个的任何想法?

2 个答案:

答案 0 :(得分:3)

如果catch-all异常处理没有捕获到这个,那么要么你没有运行这个代码,要么生产中的异常发生在try块之外。 500甚至可能是由于错误完全在python外面

在此部分代码中引入故意错误,看看您是否看到了生产行为的变化。这至少可以让你排除运行陈旧代码的可能性。

答案 1 :(得分:2)

感谢Martijn Pieters的评论和问题,我发现了一些错误,这些错误在奇怪的行为中得以解决:

  • except subprocess.CalledProcessError as e:部分包含一些unicode转换,这些转换在系统a上正常运行并导致系统b出现问题。因此,在我的异常处理中引发了UnicodeConversionError,这导致500错误,因为它没有被捕获。

  • 发布的代码中的另一个问题是unicode(sys.exc_info(), "utf-8")也引发异常,因为sys.exc_info()返回一个元组,当使用{{1}时,该元组正确转换为字符串方法,但str()只能处理字符串而不能处理元组。为我完成这项工作的一项工作是unicode()

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