2012-05-31 32 views
5

Tôi đang cố gắng xử lý lỗi trên vải, nhưng ví dụ tôi thấy trên tài liệu đã quá bản địa hóa cho khẩu vị của mình. Tôi cần thực thi các hành động rollback nếu bất kỳ hành động nào bị lỗi. Tôi cố gắng, sau đó, sử dụng những bối cảnh để xử lý nó, như thế này:Xử lý lỗi với Fabric

@_contextmanager 
def failwrapper(): 
    with settings(warn_only=True): 
     result = yield 
    if result.failed: 
     rollback() 
     abort("********* Failed to execute deploy! *********") 

Và sau đó

@task 
def deploy(): 
    with failwrapper(): 
     updateCode() 
     migrateDb() 
     restartServer() 

Thật không may, khi một trong những nhiệm vụ thất bại, tôi không nhận được bất cứ điều gì trên result.

Có cách nào để hoàn thành việc này không? Hay có cách nào khác để xử lý các tình huống như vậy?

Trả lời

6

Theo thử nghiệm của tôi, bạn có thể thực hiện điều đó với điều này:

@_contextmanager 
def failwrapper(): 
    try: 
     yield 
    except SystemExit: 
     rollback() 
     abort("********* Failed to execute deploy! *********") 

Như bạn có thể thấy tôi đã thoát khỏi những thiết lập warn_only như tôi giả sử bạn không cần nó nếu rollback có thể được thực thi và bạn đang hủy bỏ việc thực thi bằng cách hủy bỏ().

Vải tăng ngoại lệ SystemExit khi gặp phải lỗi và cài đặt cảnh báo không được sử dụng. Chúng ta chỉ có thể bắt được ngoại lệ và thực hiện rollback.

1

Tiếp theo từ câu trả lời Henri, đây cũng xử lý ngắt bàn phím (Ctrl-C) và các ngoại lệ khác:

@_contextmanager 
def failwrapper(): 
    try: 
     yield 
    except: 
     rollback() 
     raise