python捕获异常

python捕获异常,python,linux,Python,Linux,我正在运行curl命令来检查网站的状态: try: connectionTest = subprocess.Popen([r"curl --interface xx.xx.xx.xx http://www.yahoo.com"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) cstdout,cstderr = connectionTest.communicate() if cstdout:

我正在运行curl命令来检查网站的状态:

try:
    connectionTest = subprocess.Popen([r"curl --interface xx.xx.xx.xx http://www.yahoo.com"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    cstdout,cstderr = connectionTest.communicate()
    if cstdout:
        #print cstdout
        status = "OK"
    elif cstderr:
        #print cstderr
        status = "PROBLEM"
except:
    e = sys.exc_info()[1]
    print "Error: %s" % e
除了try:except语句外,代码工作正常,因为它没有正确捕获异常,下面是接口关闭时脚本的输出,现在我想捕获except语句中的第一行。。。相反,它正在繁殖……这可能吗

SIOCSIFFLAGS: Cannot assign requested address

PROBLEM

若子流程中发生任何异常,则不会抛出该异常。 检查stderr并引发适当的异常

try:
    connectionTest = subprocess.Popen([r"curl --interface xx.xx.xx.xx http://www.yahoo.com"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    cstdout,cstderr = connectionTest.communicate()
    if cstdout:
        #print cstdout
        status = "OK"
    elif cstderr:
        #print cstderr
        status = "PROBLEM"
        raise some exception
except:
    e = sys.exc_info()[1]
    print "Error: %s" % e

没有抛出异常。 您可以检查返回代码并在其不为零时引发异常:

import sys, subprocess
try:
    connectionTest = subprocess.Popen([r"curl --interface 1.1.1.1 http://www.yahoo.com"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    cstdout,cstderr = connectionTest.communicate()
    if connectionTest.returncode:
        raise Exception("Curl returned %s"%connectionTest.returncode)
    if cstdout:
        #print cstdout
        status = "OK"
    elif cstderr:
        #print cstderr
        status = "PROBLEM"
except:
    e = sys.exc_info()[1]
    print "Error: %s" % e

你确定你需要打电话给curl吗

import urllib2
try:
    urllib2.urlopen("http://www.yahoo.com")
except urllib2.URLError as err:
    print(err)
except urllib2.HTTPError as err:
    print(err)
其次,听起来你的接口地址是不可靠的,而不是你的代码。检查-interface-flag参数的正确性,即:在python外部运行curl命令,并检查它是否按预期工作

一般来说,您永远无法捕获python程序中的子进程错误,我想这就是您要问的问题。您将不得不依赖退出代码和标准输出/错误输出,这就是为什么依赖Python的解决方案会更加健壮的原因

如果需要手动指定接口,则有几个其他选项:

:


让我们看看整个stacktrace。你凭什么认为有问题?如果未触发except子句,则不存在异常。如果curl命令的输出中出现问题,只需引发异常即可。
import pycurl
import StringIO
c = pycurl.Curl()
c.setopt(pycurl.URL, "http://www.python.org/")
c.setopt(pycurl.CURLOPT_INTERFACE, "eth0")
# [...]
try:
    c.perform()
except: # Handle errors here.
  pass