2010-09-27 30 views
31

Tôi đang viết theo những điều sau đây, trong đó tôi cố gắng tạo ra một thông báo lỗi phong nha khi so sánh hai khối đa văn bản Unicode. Phương pháp nội thất mà không được so sánh đặt ra một sự khẳng định, nhưng lời giải thích mặc định là vô ích với tôiLàm thế nào để thay đổi thông báo trong Python AssertionError?

tôi cần phải thêm cái gì đó để mã như dưới đây:

def assert_long_strings_equal(one, other): 
    lines_one = one.splitlines() 
    lines_other = other.splitlines() 
    for line1, line2 in zip(lines_one, lines_other): 
     try: 
      my_assert_equal(line1, line2) 
     except AssertionError, error: 
      # Add some information to the printed result of error??! 
      raise 

tôi không thể tìm ra cách để thay đổi in thông báo lỗi trong assertionerror tôi bắt. Tôi luôn nhận được AssertionError: u'something' != 'something else', chỉ hiển thị dòng đầu tiên của đầu ra.

Làm cách nào để thay đổi thông báo xác nhận để in ra bất kỳ điều gì tôi muốn?

Nếu có liên quan, tôi đang sử dụng nose để chạy thử nghiệm.

+0

Chỉ cần làm rõ, tôi nhận thấy rằng việc bắt lỗi Lỗi xác thực là lạ. Nó chỉ xảy ra như vậy mà 'my_assert_equal' là loại sâu và tôi không muốn gây rối với nó. –

+1

Chỉ để chỉ ra, bạn nên có 'ngoại trừ' không' bắt'. Mặc dù tôi chắc chắn đó chỉ là lỗi chính tả: p – katrielalex

Trả lời

39

Sử dụng e.args, e.message bị phản đối.

try: 
    assert False, "Hello!" 
except AssertionError as e: 
    e.args += ('some other', 'important', 'information', 42) 
    raise 

Điều này bảo quản nguyên gốc. Phần cuối cùng của nó sau đó trông như thế này:

AssertionError: ('Hello!', 'some other', 'important', 'information', 42) 

trình trong cả hai Python 2.7 và Python 3.

+0

Điều này chỉ gây ra lỗi loại khi tôi thử trên 2.7. – philologon

+0

Loại lỗi nào? Tôi đã sử dụng 2,7 khi viết câu trả lời. –

+0

@philologon Tôi vừa thử giải pháp (sao chép chính xác-dán câu trả lời của tôi) trong cả Python 2.7.10 và Python 3.5.1 và nó hoạt động như mong đợi. Câu trả lời của tôi đã được bình chọn, nhưng tôi không thấy lý do gì. –

0

Bạn có thể chuyển thông báo mong muốn khi tạo ngoại lệ.

raise AssertionError(line1 + ' != ' + line2) 

Hy vọng điều này sẽ hữu ích.

+0

Đó không phải là ý nghĩa của OP; 'AssertionError' (nói chung) được đưa ra bởi câu lệnh' assert'. – katrielalex

+0

Tôi không chắc ... nhưng nếu được bọc bằng câu lệnh 'if' thay vì sử dụng' assert' thì có thể chấp nhận được. Bằng cách đó bạn có thể sử dụng khối 'if else' và dự phòng trên AssertionError với một thông báo tùy chỉnh. –

48
assert expression, info 

Ví dụ,

>>> assert False, "Oopsie" 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AssertionError: Oopsie 

Từ docs:

báo cáo Khẳng định là một cách thuận tiện để chèn khẳng định gỡ lỗi vào một chương trình :

assert_stmt ::= "assert" expression 
["," expression] 

Các hình thức đơn giản, assert expression, tương đương với

if __debug__: 
    if not expression: 
     raise AssertionError 

Các hình thức mở rộng

assert expression1, expression2 

tương đương với

if __debug__: 
    if not expression1: 
     raise AssertionError(expression2) 

Những tương đồng rằng __debug__AssertionError tham chiếu đến biến tích hợp với các tên . Trong quá trình thực hiện hiện tại, biến được xây dựng trong __debug__ là Đúng trong các trường hợp bình thường, False khi tối ưu hóa được yêu cầu (tùy chọn dòng lệnh -O). Máy phát mã hiện tại không phát ra mã nào cho một tuyên bố xác nhận khi tối ưu hóa là được yêu cầu lúc biên dịch. Lưu ý rằng không cần phải bao gồm mã nguồn cho cụm từ không thành công trong thông báo lỗi; nó sẽ được hiển thị như một phần của ngăn xếp theo dõi .

+1

Lưu ý rằng bạn cũng có thể nhúng dòng mới vào biểu thức chuỗi 'info' để làm cho chúng trông đẹp mắt khi được hiển thị. – martineau

+0

Cũng lưu ý rằng bạn có thể thêm thông tin bổ sung vào biểu thức chuỗi bằng cách sử dụng phép nội suy chuỗi của Python và các hoạt động tạo chuỗi mới hơn. – martineau

+0

Việc nêu ra một ngoại lệ nói chung không phải là một vấn đề. Nó đang bắt, sửa đổi và tái hiện lại một biểu hiện, mà tôi đã hỏi. –

5

Bạn muốn lấy ngoại lệ bị bắt, chuyển đổi nó thành chuỗi, kết hợp nó với một số thông tin chuỗi bổ sung và tăng ngoại lệ mới.

x = 3 
y = 5 
try: 
    assert(x == y) 
except AssertionError, e: 
    raise(AssertionError("Additional info. %s"%e)) 
+4

Tôi không thấy bất kỳ câu trả lời nào được đưa ra cung cấp giải pháp chung về cách thêm thông tin vào ngoại lệ và tái nâng cao với cả thông tin ban đầu và thông tin bổ sung mà tôi nghĩ là . –

+0

Russel đúng, đây là thứ tôi đang tìm kiếm. –

+13

Điều này sẽ mất dấu vết. – ninjagecko

5

Với phương pháp này, tôi đã có thể chỉnh sửa tin nhắn và vẫn có stack trace (+ bất kỳ thông tin khác) có thể nhìn thấy. Các dòng mới cũng được hiển thị ngay.

try: 
    my_assert_equal(line1, line2) 
except AssertionError as e: 
    message = e.args[0] 
    message += "\nThis appends the default message and can have newlines" 
    e.args = (message,) #wrap it up in new tuple 
    raise 
+0

Điều này bao gồm các dòng mới và không phải sao chép trên '' + = '': '' e.args = (u "% s \ n% s"% (e.args [0], addl_message),) '' –

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