2013-07-21 10 views
5

मैं निर्देशिका बनाने के कार्य सहित स्वचालित करने के लिए फैब्रिक का उपयोग कर रहा हूं। यहाँ मेरी fabfile.py है:प्रिंट पायथन अपवाद प्रकार (फैब्रिक में उठाया गया)

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

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

भागो फैब fabfile.py और च मैं पहले से ही ./www बनाई गई एक त्रुटि उठाया है, लेकिन मैं किस तरह का पता नहीं है है, तो मैं कैसे अभी तक त्रुटि को संभालने के लिए पता नहीं है ।

mkdir: cannot create directory ‘./www’: File exists 

Fatal error: local() encountered an error (return code 1) while executing 'mkdir ./www' 

Aborting. 

मुझे क्या करना चाहते हैं, ताकि मैं कंबल बयान बिना ठीक से मेरी त्रुटियों के अलावा कर सकते हैं त्रुटि प्रकार पता लगाने के लिए सक्षम हो रहा है: कपड़ा केवल निम्नलिखित बाहर प्रिंट करता है। यह वास्तव में उपयोगी होगा अगर कोई जवाब मुझे नहीं बताता कि mkdir अपवाद को कैसे संभालना है, लेकिन प्रिंट करें (या अन्यथा नाम ढूंढें) कोई अपवाद मैं लाइन में चला सकता हूं (mkdir केवल एक उदाहरण है)।

धन्यवाद!

+0

की [मनमानी अपवाद संभाल संभव डुप्लिकेट के साथ सच होने के लिए पूरी स्क्रिप्ट के warn_only सेटिंग सेट करने का प्रयास, प्रिंट डिफ़ॉल्ट अपवाद संदेश] (http://stackoverflow.com/questions/2005680/handle-arbitrary-exception-print-default-exception-message) – inspectorG4dget

+0

मैंने उन लोगों के साथ प्रयास किया, लेकिन यह काम नहीं करता क्योंकि मैं फैब्रिक के माध्यम से कोड चला रहा हूं, इस प्रकार आपका सुझाव काम नहीं करता है। हालांकि धन्यवाद। – mh00h

उत्तर

9

मुद्दा यह है कि कपड़े इस तरह के चीजों को करने के लिए उपप्रोसेस का उपयोग करता है। यदि आप local के लिए स्रोत कोड देखते हैं तो आप देख सकते हैं कि यह वास्तव में अपवाद नहीं उठाता है। यह suprocess.Popen कहते हैं और stdout और stderr पढ़ने के लिए communicate() का उपयोग करता है। यदि कोई गैर-शून्य रिटर्न कोड है तो यह warn या abort पर कॉल देता है। डिफ़ॉल्ट निरस्त है। तो, तुम क्या चाहते करने के लिए, इस प्रयास करें:

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

आप abort के लिए स्रोत को देखें, तो यह इस तरह दिखता है:

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) 

तो, अपवाद एक SystemExit अपवाद होगा। जबकि आप इसे पकड़ सकते हैं, इसे करने का उचित तरीका settings का उपयोग करके ऊपर उल्लिखित है।

+0

अगर यह किसी और को Google खोज बचाता है: fabric.api आयात सेटिंग्स से – TristanMatthews

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

यह सब कुछ है!

संपादित करें: बस अपना प्रश्न दोबारा पढ़ें और महसूस किया कि मेरा कोड केवल आपके मामले में "घातक" प्रिंट करेगा। ऐसा लगता है कि कपड़े एक त्रुटि फेंक रहा है और अपना खुद का त्रुटि कोड लौटा रहा है, इसलिए आपको दस्तावेज़ीकरण को देखना होगा। मेरे पास कपड़े के साथ कोई अनुभव नहीं है इसलिए यदि आप पहले से नहीं हैं तो मैं here देखने का सुझाव दूंगा। क्षमा करें अगर यह सहायक नहीं है! अगर ऐसा नहीं हो रहा है

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

, तो आप शायद सब पर एक अपवाद नहीं मिल रहे हैं:

0

आम तौर पर, जब आप न आया हुआ अपवाद मिलता है, अजगर अपवाद त्रुटि संदेश के साथ टाइप प्रिंट होगा।

यदि आप वास्तव में एक मनमाना अपवाद पकड़ना चाहते हैं और इसे प्रिंट करना चाहते हैं, तो आप Exception या BaseException पकड़ना चाहते हैं। BaseException में KeyboardInterrupt जैसी चीजें भी शामिल होंगी, इसलिए, इसके साथ सावधान रहें।

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

सामान्य में:

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

आपको बता देंगे क्या अपवाद था, लेकिन यदि आप की योजना नहीं बना रहे हैं वास्तव में अपवाद तो बस कोशिश से छुटकारा पाने के कुछ से निपटने: को छोड़कर: लाइनें ठीक होगा एक ही प्रभाव।

यदि आप डीबगर के तहत अपना कोड चलाते हैं तो आप उस अपवाद को देख सकते हैं जिसे आपने अधिक विस्तार से मारा है।

3

यह अपवाद के साथ संभाल करने के लिए कुछ भी नहीं है, यह कपड़े एपीआई से है

env.warn_only = True 
संबंधित मुद्दे