【问题标题】:CalledProcessError causes 500 error on apache even though it is (or should be) caughtCalledProcessError 在 apache 上导致 500 错误,即使它已(或应该)被捕获
【发布时间】:2013-10-21 18:06:49
【问题描述】:

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

我的代码(更新:添加了捕获所有异常处理 - 行为未更改)如下:

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 error.log 不是很有帮助,因为它没有显示任何错误。

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

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

对此有什么想法吗?

【问题讨论】:

  • 如果捕获所有异常处理没有捕捉到这个,那么要么您没有运行此代码,要么生产中的异常发生在外部 try 块。 500 甚至可能是由于完全python 之外的错误
  • 在这部分代码中引入一个故意的错误,看看您是否看到生产中的行为发生变化。这至少可以让您排除运行陈旧代码的可能性。
  • 感谢@MartijnPieters!我介绍了 ZeroDevisionError 和 - tadaa - 相同的行为。这启发了我从不同的角度检查我的异常处理——长话短说,发现了另一个编码问题。我将在问题的答案中更详细地解释。
  • 顺便说一句:现在是否可以结束赏金并将 50 点捐赠给@MartijnPieters?
  • 我必须发布一个答案,然后你可以将赏金奖励给那个。如果您想这样做,请重新发布我的 cmets 作为答案。 :-)

标签: python django apache subprocess


【解决方案1】:

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

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

【讨论】:

  • 感谢您重新发布作为答案!即使在下面的答案中找到了完整的解决方案(因此,如果有人遇到类似的问题 - 向下滚动一点),我认为这是“已接受”,因为它帮助我找到了解决方案。
  • 一般情况下,我的回答还是正确的;您的问题在于 try 块之外的 new 异常。
【解决方案2】:

感谢 Martijn Pieters 的 cmets 和问题,我发现了一些导致奇怪行为的错误:

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

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

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

【讨论】:

  • 对,这意味着异常确实在try 块之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2012-10-10
  • 2018-05-27
  • 2020-05-27
相关资源
最近更新 更多