2011-11-25 30 views
5

Tôi hiểu cú pháp cơ bản try:except:finally: để xử lý lỗi pythons. Những gì tôi không hiểu là làm thế nào để tìm thấy các tên lỗi thích hợp để làm cho mã có thể đọc được.Hiểu mã lỗi bằng Python và sử dụng các tên lỗi có ý nghĩa

Ví dụ:

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    s.settimeout(60)    
    char = s.recv(1) 

except socket.timeout: 
    pass 

vì vậy nếu ổ cắm đặt ra một thời gian chờ, các lỗi được bắt. Làm thế nào về nếu tôi đang tìm kiếm một kết nối từ chối. Tôi biết số lỗi là 10061. Ở đâu trong tài liệu tôi tìm để tìm một tên đầy đủ ý nghĩa như timeout. Sẽ có một nơi tương tự để tìm các mô-đun python khác? Tôi biết đây là một câu hỏi newbie nhưng tôi đã được đưa vào xử lý lỗi mã của tôi một thời gian bây giờ, mà không thực sự biết nơi để tìm các mô tả lỗi và tên.

EDIT:

Cảm ơn mọi phản hồi của bạn.

except socket.error, exception: 
    if exception.errno == ETIMEDOUT: 
     pass 

sẽ đạt được kết quả tương tự như

except socket.timeout: 
    pass 

Trả lời

5

Để đạt được những gì bạn muốn, bạn sẽ phải lấy ngoại lệ huy động, trích xuất mã lỗi lưu trữ trong, và làm cho một số if so sánh với errno codes:

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    s.settimeout(60)    
    char = s.recv(1) 
except socket.error, exception: 
    if exception.errno == errno.ECONNREFUSED: 
     # this is a connection refused 
    # or in a more pythonic way to handle many errors: 
    { 
     errno.ECONNREFUSED : manage_connection_refused, 
     errno.EHOSTDOWN : manage_host_down, 
     #all the errors you want to catch 
    }.get(exception.errno, default_behaviour)() 
except socket.timeout: 
    pass 

với:

def manage_connection_refused(): 
    print "Connection refused" 

def manage_host_down(): 
    print "Host down" 

def default_behaviour(): 
    print "error" 
2

Bạn sẽ nhận được một lỗi với một errno, được mô tả trong tài liệu errno. 10061 chỉ hợp lệ cho WinSock.

+0

ok, vậy tôi sẽ viết như thế nào để bắt ngoại lệ errno.ECONNREFUSED – Richard

+1

bạn bắt socket.error và sau đó kiểm tra mã. – unbeli

0

Theo socket, giá trị socket.error được xác định trong mô-đun errno.

Các vấn đề liên quan