LinuxQuestions.org
Help answer threads with 0 replies.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 04-26-2020, 08:06 AM   #1
Turbocapitalist
LQ Guru
 
Registered: Apr 2005
Distribution: Linux Mint, Devuan, OpenBSD
Posts: 7,386
Blog Entries: 3

Rep: Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776
Exception handling in Python


I'm wondering how to trap exceptions in Python. Specifically, when I run this code:

Code:
#!/usr/bin/python3                                                              

import urllib.request

uri = 'http://localhost:1880/'
req = urllib.request.Request(uri,method="HEAD",data=None)

with urllib.request.urlopen(uri) as response:
    try:
        res = response.read()
    except HTTPError as e:
        print("HTTP error")
    except URLError as e:
        print("URL error")
    except TypeError as e:
        print("Type error")
    except ValueError as e:
        print("Value error")
and try to connect it to a session which will abort,

Code:
timeout 2 nc -l 1880 & ./script.py
then I always get the following crash report:

Code:
GET / HTTP/1.1
Accept-Encoding: identity
Host: localhost:1880
User-Agent: Python-urllib/3.7
Connection: close

Traceback (most recent call last):
  File "./script.py", line 10, in <module>                  
    with urllib.request.urlopen(uri) as response:                              
  File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen            
    return opener.open(url, data, timeout)                                     
  File "/usr/lib/python3.7/urllib/request.py", line 525, in open               
    response = self._open(req, data)
  File "/usr/lib/python3.7/urllib/request.py", line 543, in _open              
    '_open', req)
  File "/usr/lib/python3.7/urllib/request.py", line 503, in _call_chain        
    result = func(*args)
  File "/usr/lib/python3.7/urllib/request.py", line 1345, in http_open         
    return self.do_open(http.client.HTTPConnection, req)                       
  File "/usr/lib/python3.7/urllib/request.py", line 1320, in do_open           
    r = h.getresponse()
  File "/usr/lib/python3.7/http/client.py", line 1336, in getresponse          
    response.begin()
  File "/usr/lib/python3.7/http/client.py", line 306, in begin                 
    version, status, reason = self._read_status()                              
  File "/usr/lib/python3.7/http/client.py", line 275, in _read_status          
    raise RemoteDisconnected("Remote end closed connection without"            
http.client.RemoteDisconnected: Remote end closed connection without response
What is the right way to catch that error so the script can make note of it and continue? Right now the script just dies.
 
Old 04-26-2020, 10:07 AM   #2
dugan
LQ Guru
 
Registered: Nov 2003
Location: Canada
Distribution: distro hopper
Posts: 11,273

Rep: Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341
Code:
import http

# ...

except http.client.RemoteDisconnected as e:
From what I'm seeing of the script though, you should be using a ready-made solution like Postman or HTTPie.

Last edited by dugan; 04-26-2020 at 10:34 AM.
 
Old 04-26-2020, 11:03 AM   #3
Turbocapitalist
LQ Guru
 
Registered: Apr 2005
Distribution: Linux Mint, Devuan, OpenBSD
Posts: 7,386

Original Poster
Blog Entries: 3

Rep: Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776
Quote:
Originally Posted by dugan View Post
Code:
import http

# ...

except http.client.RemoteDisconnected as e:
Hmm. I get the same result even adding those into the script above.
 
Old 04-26-2020, 11:42 AM   #4
SoftSprocket
Member
 
Registered: Nov 2014
Posts: 399

Rep: Reputation: Disabled
If you want to cacth the exception in urllib.request.urlopen you need to move it into the scope of the try. As is it's outside so not caught.
 
2 members found this post helpful.
Old 04-26-2020, 12:28 PM   #5
dugan
LQ Guru
 
Registered: Nov 2003
Location: Canada
Distribution: distro hopper
Posts: 11,273

Rep: Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341Reputation: 5341
Quote:
Originally Posted by Turbocapitalist View Post
Hmm. I get the same result even adding those into the script above.
Then post your revised script.
 
Old 04-26-2020, 12:31 PM   #6
Turbocapitalist
LQ Guru
 
Registered: Apr 2005
Distribution: Linux Mint, Devuan, OpenBSD
Posts: 7,386

Original Poster
Blog Entries: 3

Rep: Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776
Here is how I have tried it:

Code:
#!/usr/bin/python3                                                              

import urllib.request
import http

uri = 'http://localhost:1880/'
req = urllib.request.Request(uri,method="HEAD",data=None)

with urllib.request.urlopen(uri) as response:
    try:
        res = response.read()
    except http.client.RemoteDisconnected as e:
        print("Disconnect")
    except HTTPError as e:
        print("HTTP error")
    except URLError as e:
        print("URL error")
    except TypeError as e:
        print("Type error")
    except ValueError as e:
        print("Value error")
I have only a few tens of hours of experience with Python.
 
Old 04-26-2020, 12:37 PM   #7
teckk
LQ Guru
 
Registered: Oct 2004
Distribution: Arch
Posts: 5,162
Blog Entries: 6

Rep: Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836
Code:
#!/usr/bin/python

from urllib import request
from urllib.error import URLError
        
agent = ('Mozilla/5.0 (Windows NT 10.1; x86_64; rv:75.0)'
        ' Gecko/20100101 Firefox/75.0')
                
user_agent = {'User-Agent': agent}
        
uri1 = 'https://www.google.com'
uri2 = 'https://1234abc.com'

try:
    req = request.Request(uri1, data=None,  headers=user_agent)
    page = request.urlopen(req)
    res = page.read()
    print('uri1 is OK')

except URLError as e:
    print('uri1 is URLError')
    
try:
    req = request.Request(uri2, data=None,  headers=user_agent)
    page = request.urlopen(req)
    res = page.read()
    print('uri2 is OK')

except URLError as e:
    print('uri2 is URLError')
 
Old 04-26-2020, 12:50 PM   #8
Turbocapitalist
LQ Guru
 
Registered: Apr 2005
Distribution: Linux Mint, Devuan, OpenBSD
Posts: 7,386

Original Poster
Blog Entries: 3

Rep: Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776
Oops. How embarrassing. It was both the spacing and the sequence of 'try'

Code:
. . .
try:
    with urllib.request.urlopen(uri) as response:
        res = response.read()
. . .
So far, I think I've spent about 75% of my time with the white space in regards to python.
 
Old 04-26-2020, 01:09 PM   #9
teckk
LQ Guru
 
Registered: Oct 2004
Distribution: Arch
Posts: 5,162
Blog Entries: 6

Rep: Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836Reputation: 1836
So I think that would be something like:

test1.py
Code:
#!/usr/bin/python

from urllib import request
from urllib.error import HTTPError, URLError

uri = 'http://127.0.0.1:1880/'
req = request.Request(uri)

def Except():
    try:
        page = request.urlopen(req)
        res = page.read()
        print('It is ok')
        
    except HTTPError as e:
        print("HTTP error")
        
    except URLError as e:
        print("URL error")
        
    except TypeError as e:
        print("Type error")
        
    except ValueError as e:
        print("Value error")
        
if __name__ == "__main__":
    Except()
Test it.

In one terminal
Code:
python3 -m http.server 1880
In second terminal
Code:
python ./test1.py
 
Old 04-26-2020, 01:11 PM   #10
Turbocapitalist
LQ Guru
 
Registered: Apr 2005
Distribution: Linux Mint, Devuan, OpenBSD
Posts: 7,386

Original Poster
Blog Entries: 3

Rep: Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776Reputation: 3776
Thanks. I'm now digesting the changes and the suggesstions, and trying various tests.
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
LXer: Python Exception Handling LXer Syndicated Linux News 0 05-18-2017 06:14 AM
LXer: Python Python Python (aka Python 3) LXer Syndicated Linux News 0 08-05-2009 08:30 PM
help createing exception class from base STL exception qwijibow Programming 4 04-20-2005 05:23 AM
python; exception handling TheLinuxDuck Programming 2 08-20-2003 02:01 PM
Runtime Exception vs. Exception mikeshn Programming 1 09-22-2002 05:33 AM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 01:58 AM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration