2009-07-15 4 views
5

с учетом журнала ошибок трассировки, я не всегда знаю, как поймать конкретное исключение.какое исключение вызывает ошибку xxxx в python

Мой вопрос в целом, как определить, какое предложение «except» нужно написать для обработки определенного исключения.

Пример 1:

File "c:\programs\python\lib\httplib.py", line 683, in connect 
    raise socket.error, msg 
error: (10065, 'No route to host') 

Пример 2:

return codecs.charmap_encode(input,errors,encoding_table) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position(...) 

ловли 2-й пример очевиден:

try: 
    ... 
except UnicodeDecodeError: 
    ... 

как я поймать конкретно первую ошибку?

ответ

4

Посмотрите на трассировку стека. Код, вызывающий исключение: raise socket.error, msg.

Так что ответ на ваш вопрос: вы должны поймать socket.error.

import socket 
... 
try: 
    ... 
except socket.error: 
    ... 
0

Если у вас есть исключение, уникальное для модуля, вам просто нужно использовать тот же класс, который использовался для его повышения. Здесь у вас есть преимущество, потому что вы уже знаете, где класс исключений, потому что вы его поднимаете.

try: 
    raise socket.error, msg 
except socket.error, (value, message): 
    # O no! 

Но для другого такого исключения вы либо должны ждать, пока не выкинут, чтобы найти, где класс, или вы должны прочитать документацию, чтобы узнать, где она приходит от.

+0

-1 Он НЕ поднимает его, модуль 'httplib' поднимает его. Отладка 101, Урок 1: внимательно прочитайте трассировку. –

3

Первый, также очевидно, как второй, например.

>>> try: 
...  socket.socket().connect(("0.0.0.0", 0)) 
... except socket.error: 
...  print "socket error!!!" 
... 
socket error!!! 
>>> 
Смежные вопросы