2012-03-26 5 views
-1

j'exécute une commande curl pour vérifier l'état d'un site Web:python attraper exception

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 

Le code fonctionne bien sauf pour l'essai: except comme ne pas attraper l'exception correctement, ci-dessous est la sortie du script lorsque l'interface est en panne, maintenant je voudrais attraper cette première ligne dans la déclaration d'exception ... au lieu de cela être engendré ... est-ce possible ??

SIOCSIFFLAGS: Cannot assign requested address 

PROBLEM 
+3

Montrez-nous l'ensemble stacktrace. Qu'est-ce qui vous fait penser qu'il y a un problème? Si votre clause except n'est pas déclenchée, il n'y a pas d'exception. – Marcin

+0

déclenche simplement une exception s'il y a un problème dans la sortie de la commande curl. –

Répondre

3

Si une exception se produit dans le sous-processus, elle ne sera pas lancée. vérification stderr et lever exception appropriée

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 
5

Il ne fait pas exception jetée. Vous pouvez vérifier le code de retour et lancer une exception quand il est différent de zéro:

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 
0

Êtes-vous sûr que vous devez appeler à friser? Deuxièmement, il semble que votre adresse d'interface soit douteuse, plutôt que votre code. Vérifiez l'argument du drapeau --interface pour l'exactitude (c.-à-:. exécutez la commande boucle en dehors du python et vérifier qu'il fonctionne comme prévu)

De manière générale, vous ne serez jamais capable d'attraper une erreur de traitement de l'enfant intérieur votre programme python (Ce que je pense que vous demandez). Vous devrez compter sur les codes de sortie et sortie stdout/err, ce qui explique pourquoi une solution qui repose sur included batteries de Python sera beaucoup plus robuste.

Si vous devez spécifier manuellement l'interface, vous avez plusieurs autres options:

  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. Change the source interface manually in python for urllib2
Questions connexes