2013-07-21 36 views
5

Tôi đang sử dụng Fabric để tự động hóa, bao gồm nhiệm vụ tạo thư mục. Dưới đây là fabfile.py tôi:In Loại ngoại lệ Python (Tăng trong vải)

#!/usr/bin/env python 
from fabric.api import * 

def init(): 
    try: 
     local('mkdir ./www') 
    except ##what exception?##: 
     #print exception name to put in above 

Run fab fabfile.py và f Tôi đã có ./www tạo ra một lỗi được nâng lên, nhưng tôi không biết những gì loại, vì vậy tôi không biết làm thế nào để xử lý các lỗi chưa . Vải chỉ in ra như sau:

Điều tôi muốn làm là tìm ra loại lỗi để tôi có thể trừ lỗi của mình đúng cách mà không có báo cáo chăn. Nó sẽ thực sự hữu ích nếu một câu trả lời không chỉ cho tôi biết cách xử lý ngoại lệ mkdir, nhưng in (hoặc tìm cách khác) bất kỳ ngoại lệ nào tôi có thể chạy xuống dòng (mkdir chỉ là một ví dụ).

Cảm ơn bạn!

+0

trùng lặp có thể xảy ra [Xử lý ngoại lệ Arbitrary, In Mặc định Thông báo ngoại lệ] (http://stackoverflow.com/questions/2005680/handle-arbitrary-exception-print-default-exception-message) – inspectorG4dget

+0

Tôi đã thử với những điều đó, nhưng nó không hoạt động khi tôi chạy mã thông qua Fabric, do đó đề xuất của bạn không hoạt động. Cảm ơn mặc dù. – mh00h

Trả lời

9

Vấn đề là vải sử dụng tiến trình con để thực hiện những việc này. Nếu bạn nhìn vào mã nguồn cho local, bạn có thể thấy nó không thực sự làm tăng ngoại lệ. Nó gọi suprocess.Popen và sử dụng communicate() để đọc stdout và stderr. Nếu có mã trả về khác 0 thì nó sẽ trả về một cuộc gọi đến warn hoặc abort. Mặc định là hủy bỏ. Vì vậy, để làm những gì bạn muốn, hãy thử này:

def init(): 
    with settings(warn_only=True): 
     local('mkdir ./www') 

Nếu bạn nhìn vào các nguồn cho abort, nó trông như thế này:

10 def abort(msg): 
21  from fabric.state import output 
22  if output.aborts: 
23   sys.stderr.write("\nFatal error: %s\n" % str(msg)) 
24   sys.stderr.write("\nAborting.\n") 
25  sys.exit(1) 

như vậy, ngoại trừ sẽ là một ngoại lệ SystemExit. Trong khi bạn có thể nắm bắt điều này, cách thích hợp để làm điều đó được nêu trên bằng cách sử dụng settings.

+0

Nếu nó lưu người khác tìm kiếm trên google: từ cài đặt nhập fabric.api – TristanMatthews

-1
def init(): 
    try: 
     local('mkdir ./www') 
    except Exception as e: 
     print e.__class__.__name__ 

Đó là tất cả để có nó!

chỉnh sửa: Chỉ cần đọc lại câu hỏi của bạn và nhận ra rằng mã của tôi sẽ chỉ in "Gây tử vong" trong trường hợp của bạn. Có vẻ như vải đang ném một lỗi và trả lại mã lỗi riêng của họ, do đó bạn sẽ phải xem tài liệu. Tôi không có bất kỳ kinh nghiệm với vải vì vậy tôi đề nghị để xem here nếu bạn chưa có. Xin lỗi nếu điều này không hữu ích!

0

Thông thường, khi bạn nhận được một ngoại lệ còn tự do, Python sẽ in ngoại trừ gõ cùng với các thông báo lỗi:

>>> raise IOError("Error message.") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IOError: Error message. 

Nếu điều đó không xảy ra, có lẽ bạn đang không nhận được một ngoại lệ nào cả.

Nếu bạn thực sự muốn bắt ngoại lệ tùy ý và in nó, bạn muốn bắt Exception hoặc BaseException. BaseException sẽ bao gồm ngay cả những thứ như KeyboardInterrupt, mặc dù vậy, hãy cẩn thận với điều đó.

def init(): 
try: 
    local('mkdir ./www') 
except BaseException as e: 
    print "local() threw a", type(e).__name__ 
    raise # Reraise the exception 
-1

Nói chung:

try: 
     some_code() 
    except Exception, e: 
     print 'Hit An Exception', e 
     raise 

Will tell you gì ngoại trừ là nhưng nếu bạn không có kế hoạch trên thực tế xử lý một số các ngoại lệ sau đó chỉ cần loại bỏ các thử: trừ: dòng sẽ có chính xác cùng một hiệu ứng.

Ngoài ra, nếu bạn chạy mã của mình trong trình gỡ rối thì bạn có thể xem (các) trường hợp ngoại lệ mà bạn đã nhấn chi tiết hơn.

3

Đó là không có gì để xử lý với ngoại lệ, đó là từ api vải

cố gắng để thiết lập warn_only toàn bộ kịch bản của đến mức khó tin với

env.warn_only = True 
Các vấn đề liên quan