python捕获异常
我正在运行curl命令来检查网站的状态: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:
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