2013-12-08 28 views
5

Giả sử chúng tôi muốn nhập tập lệnh có tên user.py, điều này có thể không thành công.Làm thế nào để bắt một EntryError không đệ quy?

try: 
    import user 
except ImportError: 
    logging.info('No user script loaded.') 

Làm sao chúng ta có thể chắc chắn để chỉ nắm bắt những suy nhập khẩu có thể có của user.py bản thân, chứ không phải hàng hoá nhập khẩu có thể được chứa trong user.py?

+0

Bài đăng liên quan này cung cấp giải pháp đẹp hơn cho 'python3.3' cũng hoạt động cho nhập khẩu động: http://stackoverflow.com/questions/28798208/how-to-catch-an-importerror-non-recursively-dynamic -import –

Trả lời

1

Bạn có thể kiểm tra xem nếu traceback hiện nay là một phần của một chuỗi các tracebacks:

import sys 

try: 
    import user 
except ImportError: 
    if sys.exc_info()[2].tb_next: 
     raise 

    logging.info('No user script loaded.') 

Nếu có một ImportError trong user, sys.exc_info()[2].tb_next sẽ trỏ đến nó.

1

Bạn có thể nhìn vào các đối số:

try: 
    import user 
except ImportError as exception: 
    if 'user' == exception.args[0][16:]: 
     logging.info('No user script loaded.') 

Điều này đảm bảo bạn sẽ chỉ đăng thông điệp rằng khi kịch bản người dùng không phải nhập khẩu.

Mặc dù, có thể lập luận rằng việc không nhập một trong các mục nhập trong user cũng ngụ ý rằng nó không thể nhập user (có nghĩa là bạn vẫn cần ghi nhật ký thư).

+1

Cách tiếp cận này là một chút mong manh, vì nó sẽ đưa ra một kết quả dương tính giả cho 'No module named not_user'. – Blender

+0

@Blender Tôi đã cập nhật nó để tên mô-đun cần khớp chính xác với 'người dùng'. Khác hơn là tôi đồng ý nó mong manh trong ý nghĩa rằng dòng 2 và dòng 4 cần phải chứa cùng một tên mô-đun. –

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