исключение ловли питона - PullRequest
0 голосов
/ 26 марта 2012

я запускаю команду 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: исключением, поскольку он неправильно перехватывает исключение, ниже выводсценарий, когда интерфейс не работает, теперь я хотел бы поймать эту первую строку в операторе кроме ... вместо этого он вызывается ... это возможно ??

SIOCSIFFLAGS: Cannot assign requested address

PROBLEM

Ответы [ 3 ]

5 голосов
/ 26 марта 2012

Нет исключений. Вы можете проверить код возврата и выдать исключение, когда оно не равно нулю:

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
3 голосов
/ 26 марта 2012

если в подпроцессе происходит какое-либо исключение, оно не будет выброшено. проверьте 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
0 голосов
/ 26 марта 2012

Вы уверены, что вам нужно вызвать керл?

import urllib2
try:
    urllib2.urlopen("http://www.yahoo.com")
except urllib2.URLError as err:
    print(err)
except urllib2.HTTPError as err:
    print(err)

Во-вторых, похоже, что ваш интерфейсный интерфейс не совсем понятен, а не ваш код. Проверьте правильность аргумента флага --interface (то есть: запустите команду curl вне python и убедитесь, что она работает должным образом. )

Как правило, вы никогда не сможете обнаружить ошибку дочернего процесса внутри вашей программы на Python (о чем я думаю, вы спрашиваете). Вам придется полагаться на коды выхода и вывод stdout / err , поэтому решение, основанное на включенных батареях Python , будет гораздо более надежным.

Если вам нужно указать интерфейс вручную, у вас есть несколько других опций:

  1. PyCurl

    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 
    
  2. Изменить исходный интерфейс вручную в python для urllib2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...