2012-01-04 23 views
13

Tôi nhận được một lỗi lạ mà tôi dường như không thể tìm thấy giải pháp cho.Lỗi "BadStatusLine" của Python/Django

Lỗi này không xảy ra mỗi khi tôi nhấn đoạn mã này và cũng không xảy ra cho cùng một lần lặp qua vòng lặp (nó xảy ra trong vòng lặp). Nếu tôi chạy nó đủ, nó dường như không gặp lỗi và chương trình thực thi thành công. Bất kể, tôi vẫn muốn tìm ra lý do tại sao điều này xảy ra.

Đây là lỗi của tôi, phiên bản, dấu vết, vv: http://dpaste.com/681658/

Có vẻ như xảy ra với dòng sau trong mã của tôi:

page = urllib2.urlopen(url) 

đâu url là .... một URL rõ ràng.

Và có import urllib2 trong mã của tôi.

Trả lời

29

Ngoại lệ BadStatusLine được tăng lên khi bạn gọi urllib2.urlopen(url) và máy chủ từ xa phản hồi bằng mã trạng thái mà python không thể hiểu được.

Giả sử bạn không kiểm soát url, bạn không thể ngăn điều này xảy ra. Tất cả những gì bạn có thể làm là bắt ngoại lệ và quản lý nó một cách duyên dáng.

from httplib import BadStatusLine 

try: 
    page = urllib2.urlopen(url) 
    # do something with page 
except BadStatusLine: 
    print "could not fetch %s" % url 
7

Điều này không liên quan gì đến Django, đây là ngoại lệ được ném bởi urllib2 không thể phân tích cú pháp phản hồi sau khi tìm nạp url của bạn. Đó có thể là sự cố mạng, phản hồi không đúng định dạng… Một số máy chủ/ứng dụng ném loại lỗi này một cách ngẫu nhiên. Nếu bạn không kiểm soát những gì URL này trả về bạn còn lại với việc bắt ngoại lệ, hãy gỡ lỗi các URL nào đang gây ra sự cố và cố gắng xác định mẫu.

7

Giải thích từ những người dùng khác là đúng và tốt, nhưng trong thực tế bạn có thể tìm thấy điều này hữu ích:
Theo kinh nghiệm của tôi điều này thường xảy ra khi bạn đang gửi các giá trị không thể viện chứng các thông số url, như giá trị không gian chứa hoặc khác các ký tự cần phải được trích dẫn hoặc mã hóa url.

+1

Thực ra, điều xảy ra khi bạn gửi các giá trị không có mã hóa URL thích hợp là bạn nhận được yêu cầu không hợp lệ 400. –

+0

Có thể máy chủ được thiết lập sai (giống như tôi đã viết) và thay vì 400, nó sẽ không gửi lại gì cả. Đó là một BadStatusLine. – Noumenon

+0

Trong trường hợp của tôi, điều đó xảy ra vì tiêu đề tôi đã gửi có '\ n' –