Arpan Ghimire
Arpan Ghimire

Reputation: 95

Exception Handling Request through SSLError

This is my function for checking link. But it throws an error when the link is fake. For example, it works for twitter.com but not for twitt.com.

class Quality_Check:
    def check_broken_link(self,data):
        url= requests.head(data)

        try:
            if url.status_code==200 or url.status_code==302 or url.status_code==301:
                return True
        except requests.exceptions.SSLError as e:
            return False

qc=Quality_Check()
print(qc.check_broken_link('https://twitte.com'))

When i try to handle the exception by this method it shows following error:

Traceback (most recent call last):
      ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)

During handling of the above exception, another exception occurred:

raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='twitte.com', 
port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, 
'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)'),))

and another one appeared too

requests.exceptions.SSLError: HTTPSConnectionPool(host='twitte.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)'),))

Upvotes: 4

Views: 8648

Answers (1)

FatihAkici
FatihAkici

Reputation: 5109

Exception happens on the url= requests.head(data) line. So you should include that line in try like so:

class Quality_Check:
    def check_broken_link(self,data):
        try:
            url = requests.head(data)
            if url.status_code == 200 or url.status_code == 302 or url.status_code == 301:
                return True
        except requests.exceptions.SSLError as e:
            return False

qc=Quality_Check()
qc.check_broken_link('https://twitte.com')

Returns False, and on 'https://twitter.com' it returns True, which is the desired result.


And by the way, you can change your line of

if url.status_code == 200 or url.status_code == 302 or url.status_code == 301:

to

if url.status_code in (200, 302, 301):

Upvotes: 6

Related Questions