2009-12-06 36 views
11

Cân nhắc hai đoạn mã sau:SyntaxError không nhất quán trong Python?

try: 
    a+a=a 
except SyntaxError: 
    print "first exception caught" 

.

try: 
    eval("a+a=a") 
except SyntaxError: 
    print "second exception caught" 

Trong trường hợp thứ hai, câu lệnh "ngoại lệ thứ hai .." được in (ngoại lệ bị bắt), trong khi câu lệnh thứ nhất không được.

Ngoại lệ đầu tiên (cho phép gọi nó là "SyntaxError1") bất kỳ khác biệt nào với phiên bản thứ hai ("SyntaxError2")?

Có cách nào để bắt SyntaxError1 (do đó có lỗi thời gian biên dịch) không? Gói khối lượng lớn các mã trong eval là không đạt yêu cầu;)

+0

Ngăn chặn các lỗi biên dịch thời gian ???? Điều đó có thể có ý nghĩa gì? Bạn có thể cung cấp một số định nghĩa cho trường hợp sử dụng mà bạn muốn mã không thể phân tích để phân tích cú pháp không? Điều gì được cho là sẽ xảy ra? Mã có thể xấu đến mức nào nhưng vẫn được "phân tích cú pháp"? Bạn đang nói về cái gì vậy? –

+0

Câu hỏi đã được tập trung chủ yếu vào sự không nhất quán có thể có của SyntaxErrors ném trong tình huống khác nhau. Alex giải thích rằng không có mâu thuẫn ở tất cả, và tất cả các hành vi được mô tả bao gồm trong các cơ chế của trình biên dịch xây dựng cấu trúc cấp cao hơn của try/except. Một trường hợp sử dụng có thể xảy ra có thể được tải lên bởi một nhà phát triển đáng tin cậy * tệp .py với một số chức năng (hệ thống plugin đơn giản?), Với sự cần thiết xác thực cú pháp của nó ngay sau khi tải lên. – gorsky

Trả lời

15

Trong trường hợp đầu tiên, ngoại trừ được nêu ra bởi trình biên dịch, mà là chạy trước cấu trúc try/except thậm chí tồn tại (vì nó là trình biên dịch riêng của mình rằng sẽ thiết lập nó lên ngay sau khi phân tích cú pháp). Trong trường hợp thứ hai, trình biên dịch đang chạy hai lần - và ngoại lệ được tăng lên khi trình biên dịch chạy như một phần của eval, sau lần chạy đầu tiên của trình biên dịch đã thiết lập try/except. Vì vậy, để chặn các lỗi cú pháp, theo cách này hay cách khác, bạn phải sắp xếp trình biên dịch chạy hai lần - eval là một cách, rõ ràng compile gọi hàm khác được xây dựng, import khá tiện dụng (sau khi viết mã tới một tệp khác), execexecfile các khả năng khác. Nhưng tuy nhiên bạn làm điều đó, lỗi cú pháp có thể được bắt chỉ sau khi trình biên dịch đã chạy một lần đầu tiên để thiết lập các khối try/except bạn cần!

+0

Tôi không biết nhiều giải pháp. Đặc biệt là một với nhập khẩu rõ ràng giải quyết trường hợp ẩn của tôi thanh lịch. Cảm ơn rất nhiều, Alex! – gorsky

2

Câu trả lời ngắn: Số

lỗi Cú pháp xảy ra khi mã được phân tách, mà cho mã Python bình thường là trước khi mã được thực thi - mã không thực hiện bên trong try/trừ khối từ mã không phải là thi hành, thời gian.

Tuy nhiên khi bạn đánh giá hoặc thực hiện một số mã, khi đó bạn phân tích cú pháp nó khi chạy, vì vậy bạn có thể bắt ngoại lệ.

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