2015-03-31 11 views
6

Giả sử rằng tôi có đối tượng threading.Lock() mà tôi muốn có được để sử dụng tài nguyên. Giả sử tôi muốn sử dụng mệnh đề try ... except ... với tài nguyên.Cách sử dụng tối ưu khóa bằng cách thử ... ngoại trừ trong Python 2.7?

Có một số cách để thực hiện việc này.

Phương pháp 1

import threading 
lock = threading.Lock() 
try: 
    with lock: 
     do_stuff1() 
     do_stuff2() 
except: 
    do_other_stuff() 

Nếu một lỗi xảy ra trong quá do_stuff1() hoặc do_stuff2(), khóa sẽ được phát hành? Hoặc là tốt hơn để sử dụng một trong các phương pháp sau đây?

Phương pháp 2

with lock: 
    try: 
     do_stuff1() 
     do_stuff2() 
    except: 
     do_other_stuff() 

Phương pháp 3

lock.acquire(): 
try: 
    do_stuff1() 
    do_stuff2() 
except: 
    do_other_stuff() 
finally: 
    lock.release() 

Những phương pháp nào tốt nhất cho các khóa sẽ được phát hành ngay cả khi một lỗi xảy ra?

+0

['try: .. except: pass'] (http://stackoverflow.com/q/21553327/1903116) rất tệ. – thefourtheye

+0

Cá nhân tôi thích phương thức thứ nhất mà không có 'try..except' – thefourtheye

+4

Đây là toàn bộ điểm * của' với', phần '__exit__' của trình quản lý ngữ cảnh giải phóng khóa bất cứ điều gì xảy ra. Nếu bạn muốn bắt lỗi trong những gì bạn làm với nó, 'try' sẽ là * bên trong *' with' (Phương pháp 2). – jonrsharpe

Trả lời

5

with"context manager" yêu cầu phương thức __exit__, trong trường hợp này sẽ đảm bảo rằng, bất cứ điều gì xảy ra, lockrelease d.

Nếu bạn muốn xử lý ngoại lệ xảy ra trong bất cứ điều gì mà bạn đang làm với lock đó, bạn nên đặt trybên khối with, ví dụ: Cách 2 là cách tiếp cận đúng. Nói chung, bạn nên luôn cố gắng giảm thiểu số lượng mã trong khối try.

Bạn cũng nên càng cụ thể càng tốt về những gì có thể bị lỗi; except: là hành vi không tốt (xem ví dụ: "the evils of except"). Tại số ít nhất (ngay cả đối với một ví dụ đơn giản!), Bạn nên sử dụng except Exception:.

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