2011-06-20 17 views
0
import httplib 
import urlparse 

def getUrl(url): 
    try: 
    parts = urlparse.urlsplit(url) 
    server = parts[1] 
    path = parts[2] 
    obj = httplib.HTTPConnection(server,80) 
    obj.connect() 
    obj.putrequest('HEAD',path) 
    obj.putheader('Accept','*/*') 
    obj.endheaders() 
    response = obj.getresponse() 
    contentType = response.getheader("content-type", "unknown") 
    obj.close() 
    if response.status !=200: 
     print 'Error' 
    else: 
     print 'Awesome' 
    except Exception, e: 
    print e 

指定されたURLが有効かどうかを確認するコードを記述しました。しかし、何とか私はそれをテストすると、すべての無効なURLの例外がスローされます。無効なURLが例外をスローする -

>>> getUrl('http://www.idlebrfffain.com') 
[Errno -2] Name or service not known 

Pythonのバージョン:

[email protected]:~$ python -V 
Python 2.6.4 

は、誰も私が間違いを正確にある場所を見つけることができますか?

+3

ドメインを解決できないため、例外がスローされます。これはあなたのコードにとってなぜ問題なのですか? –

+0

私の正確な問題は、ドメインを解決できないときにif条件にジャンプするコードにしたいのです。私はこれを行うことができる別の方法があります、私の目的は、特定のURLが有効かどうかを確認することです。 – LearnCode

+0

'if'は例外をキャッチすることとは関係ありません。再試行する。 –

答えて

2

あなたはsocket.errorをキャッチする必要があります。

特定の行の周りの
import httplib, socket 
import urlparse 

def getUrl(url): 
    parts = urlparse.urlsplit(url) 
    server = parts[1] 
    path = parts[2] 
    obj = httplib.HTTPConnection(server,80) 

    try: 
     obj.connect() 
    except socket.gaierror: 
     print "Host %s does not exist" % server 
     return 
    except socket.error: 
     print "Cannot connect to %s:%s." % (server, 80) 
     return 

    obj.putrequest('HEAD',path) 
    obj.putheader('Accept','*/*') 
    obj.endheaders() 
    response = obj.getresponse() 
    contentType = response.getheader("content-type", "unknown") 
    obj.close() 
    if response.status !=200: 
     print 'Error' 
    else: 
     print 'Awesome' 


getUrl('http://www.idlebrfffain.com') # not a registered domain 
getUrl('http://8.8.8.8') # not a http server 

のみtry: except:を、あなたは何が起こるか知っている場合にのみ。 Pythonはキャッチされていない例外のトレースバックを表示するので、問題のある箇所を簡単に見つけることができます。

2

これは起こりそうです。 URLを解決できないため、例外がスローされています。これはあなたのexceptブロックに制御を移すあなたのif response.status != 200行の前にスローされます。

Exceptionsの仕組みを調べるには、時間を費やす必要があります。あなたが試すことができるものの例を以下に示します。

def getUrl(url): 
    status = None 
    try: 
     # do your normal stuff... 
     status = response.status 
    except Exception, e: 
     # do whatever you want here... 
     pass 
    finally: 
     if status != 200: 
      print "Error" 
     else: 
      print "Awesome" 
+1

私はそれを'else'ではなく' finally'です。 –

1
#The following code validates a url. This is a 2 step process, to do that. First I validate the domain and next the path attached to the domain. 
from urlparse import urlparse 
import urllib2 
import socket 
class ValidateURL: 
    def __init__(self, url): 
     self._url = url 

    def startActivity(self): 
     self._parts = urlparse(self._url) 
     a = self._checkDomain(self._parts[1]) 
     if a: 
      b = self._checkUrl(self._url) 
      if b == 1: 
       print self._url,' is valid' 
      else: 
       print 'The path ',self._parts[2],' is not valid' 
     else: 
      print self._parts[1],' domain does not exist' 

    #Checks whether the domain is right or not 
    def _checkDomain(self,domain): 
     x = 1 
     try: 
      socket.gethostbyname_ex(domain) 
     except socket.gaierror: 
      x = 0 
     except socket.error: 
      x = 0 
     finally: 
      return x 

    #Checks whether the path is right or not 
    def _checkUrl(self,url): 
     x = 1 
     self._req = urllib2.Request(url) 
     try: 
      urllib2.urlopen(self._req) 
     except urllib2.URLError, e: 
      #print e 
      x = 0 
     finally: 
      return x 

if __name__ == "__main__": 
    valid = ValidateURL('http://stackoverflow.com/questions/invalid-urls-throw-an-exception-python') 
    valid.startActivity() 
    valid1 = ValidateURL('http://stackoverflow.com/questions/6414417/invalid-urls-throw-an-exception-python') 
    valid1.startActivity() 

私が得た解決策が賢明であることを願っています。

関連する問題