2011-01-13 38 views
10

Trong một chức năng xem, tôi có cái gì đó như:Ở Django, làm thế nào tôi có thể nhận được thông báo của một ngoại lệ?

try: 
    url = request.POST.get('u', '') 
    if len(url) == 0: 
     raise ValidationError('Empty URL') 
except ValidationError, err: 
    print err 

Đầu ra là một chuỗi: [u'Empty URL']

Khi tôi cố gắng để vượt qua các thông báo lỗi để mẫu của tôi (nhồi trong một dict, một cái gì đó giống như { 'error_message': err.value }), mẫu nhận được tin nhắn thành công (sử dụng {{ error_message }}).

Vấn đề là tôi nhận được cùng một chuỗi chính xác như trên, [u'Empty URL'], với [u'...']!

Làm cách nào để loại bỏ điều đó?

(Python 2.6.5, 1.2.4 Django, Xubuntu 10,04)

Trả lời

12

ValidationError thực sự chứa nhiều thông báo lỗi.

Đầu ra của print err[u'Empty URL'] vì đó là chuỗi được trả về bởi repr(err.messages) (xem ValidationError.__str__ mã nguồn).

Nếu bạn muốn in một thông điệp có thể đọc được đơn ra khỏi một ValidationError, bạn có thể nối danh sách các thông báo lỗi, ví dụ:

print '; '.join(err.messages) 
+0

Tôi nhận thấy rằng, vì trình xác thực cho một trường cũng là một mảng. Điều cần biết về thành viên 'messages' của' ValidationError'. Họ không bao giờ đề cập đến nó ở đây: https://docs.djangoproject.com/en/dev/ref/forms/validation/ vì chúng chủ yếu nên! –

-2

tôi cố định nó bằng cách thay đổi ValidationError-BaseException.

+1

Đó thực sự là thói quen xấu tôi muốn nói. BaseException bắt tất cả mọi thứ, trong khi bạn chỉ nên xử lý ValidationError. Nếu một ngoại lệ khác xuất hiện, đó là do có lỗi trong mã của bạn, cần phải sửa lỗi. – Fred

+0

Vâng, tôi đã tự nâng cao lỗi/ngoại lệ. Mã trong khối 'try' là _very_ tối thiểu, mà tôi nghĩ cơ hội của một loại lỗi khác xuất hiện rất mỏng. Tôi chỉ muốn sử dụng lại 'ValidationError' cho các mục đích ngữ nghĩa. Tôi đoán cách tiếp cận thích hợp hơn sẽ là phân lớp 'BaseException' với loại lỗi xác thực của riêng tôi? Trong mọi trường hợp, mã đã thay đổi rất nhiều kể từ khi tôi đăng lần đầu tiên và cách giải quyết của tôi không còn áp dụng được nữa, vì vậy tôi đã chấp nhận câu trả lời ở trên thay thế. –

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