2012-01-18 34 views
8

Trước hết - tôi không gặp vấn đề với mã không được thụt lề và tôi có ý tưởng về cách ngoại lệ này hoạt động như thế nào.Cách nắm bắt IndentationError

Tôi hỏi, nếu có cách nào để bắt IndentationError trong mã với khối thử/ngoại trừ? Ví dụ, giả sử tôi đang viết một bài kiểm tra cho một hàm được viết bởi người khác. Tôi muốn chạy nó trong thử/trừ khối và xử lý tất cả các cảnh báo anh/cô ấy có thể thực hiện. Tôi biết, đó không phải là một ví dụ điển hình nhất, nhưng cái đầu tiên đến với tâm trí tôi. Xin vui lòng, không tập trung vào một ví dụ, mà là về vấn đề.

Hãy nhìn vào các mã:

try: 
    f() 
except IndentationError: 
    print "Error" 

print "Finished" 

Chức năng:

def f(): 
    print "External function" 

Và kết quả là:

External function 
Finished 

Và đó là một cái gì đó, tôi đã sẵn sàng để hiểu, bởi vì indentation trong hàm bên ngoài là nhất quán.

Nhưng khi chức năng nhìn như thế:

def f(): 
    print "External function" 
    print "with bad indentation" 

Trường hợp ngoại lệ là unhandled:

print "with bad indentation" 
    ^
IndentationError: unexpected indent 

Có cách nào để đạt được nó? Tôi đoán đó là vấn đề biên soạn, và đến nay tôi không thấy bất kỳ khả năng nào để bắt kịp. Có phải except IndentationError có ý nghĩa gì không?

+0

Lưu ý rằng 'IndentationError' là một lớp con của' SyntaxError'. –

Trả lời

11

Có, điều này có thể được thực hiện. Tuy nhiên, chức năng được thử nghiệm sẽ phải sống trong một mô-đun khác:

# test1.py 
try: 
    import test2 
except IndentationError as ex: 
    print ex 

# test2.py 
def f(): 
    pass 
     pass # error 

Khi chạy, điều này sẽ loại trừ một cách chính xác ngoại lệ. Nó là giá trị không có gì là việc kiểm tra được thực hiện trên toàn bộ mô-đun cùng một lúc; Tôi không chắc chắn nếu có một cách để làm cho nó chi tiết hơn.

5

Bạn có thể sử dụng công cụ như pylint, công cụ này sẽ phân tích mô-đun của bạn và báo cáo sự thụt lề xấu, cũng như nhiều lỗi khác.

6

IndentationError được nâng lên khi mô-đun được biên dịch. Bạn có thể phát hiện khi nhập mô-đun, vì mô-đun sẽ được biên dịch vào lần nhập đầu tiên. Bạn không thể bắt nó trong cùng một mô-đun có chứa try/except, vì với IndentationError, Python sẽ không thể hoàn thành việc biên dịch mô-đun và không có mã nào trong mô-đun sẽ được chạy.

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