Ben een tijdje geleden mezelf wat in te lezen in Python. Nu ben ik bezig om een voorbeeld server en client te schrijven. Dat gaat geweldig met asyncore en asyn_chat. Echter, als het allemaal mooi meewerkt
. Ik heb het probleem even terug gebracht naar een simpele HTTP client. Stel ik wil connecten met een onbestaande host. Na een timeout zou je dus problemen moeten krijgen, die krijg ik ook. Dit wordt echter afgevangen door asyncore zelf (warning; unhandled exception).
Als ik de code dan even bekijk dan wordt dus een asyncore.handle_expt() functie gedraaid. Als ik die overload dan weet ik dat er 'iets' fout is gegaan. Maar waarom kan ik niet 'gewoon' een exceptie afvangen bij het punt waar het dreigt mis te gaan. Zoals ik hieronder probeer:
Je ziet dat de exceptions die ik af probeer te vangen nooit getriggered worden. Wat is hier aan te doen?
Als ik de code dan even bekijk dan wordt dus een asyncore.handle_expt() functie gedraaid. Als ik die overload dan weet ik dat er 'iets' fout is gegaan. Maar waarom kan ik niet 'gewoon' een exceptie afvangen bij het punt waar het dreigt mis te gaan. Zoals ik hieronder probeer:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| import asyncore, socket class http_client(asyncore.dispatcher): def __init__(self, host, path): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) try: self.connect( (host, 80) ) except socket.error: print "socket error" except socket.timeout: print "socket timeout" except: print "standard exception" else: self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path def handle_connect(self): print "connected" def handle_close(self): self.close() def handle_read(self): print self.recv(8192) def writable(self): return (len(self.buffer) > 0) def handle_write(self): sent = self.send(self.buffer) self.buffer = self.buffer[sent:] c = http_client('www.nietbestaandiets.org', '/') asyncore.loop() |
Je ziet dat de exceptions die ik af probeer te vangen nooit getriggered worden. Wat is hier aan te doen?