2012-04-15 11 views
18

mam to try/z wyjątkiem kodu:Jak wyjść z programu w try/except?

document = raw_input ('Your document name is ') 

try: 
    with open(document, 'r') as a: 
     for element in a: 
      print element 

except: 
    print document, 'does not exist' 

Jak mogę wyjść z programu po drukować „[nazwa pliku] nie istnieje”? break i pass oczywiście nie działają, a ja nie chcę mieć żadnych błędów powodujących zawieszenie, więc sys.exit nie jest opcją.

Proszę zignorować część try - to tylko manekin.

Odpowiedz

6

Korzystanie

sys.exit(1) 

nie jest upaść błąd, jest to całkowicie normalne sposób, aby wyjść z programu. Kod wyjścia 1 to konwencja, która oznacza, że ​​coś poszło nie tak (w przypadku pomyślnego uruchomienia zwracasz 0).

+0

Z ciekawości, czy jest coś nie tak z użyciem 'quit()'? Nikt chyba o tym nie wspomina. –

+2

'quit()' jest przeznaczony tylko do pracy w interaktywnej powłoce Pythona. Nie użyłbym go w programie. Nie ma go na http://docs.python.org/library/functions.html i nie spodziewałbym się, że będzie on przenośny dla innych implementacji Pythona. –

23

Użyj sys.exit:

import sys 

try: 
    # do something 
except Exception, e: 
    print >> sys.stderr, "does not exist" 
    print >> sys.stderr, "Exception: %s" % str(e) 
    sys.exit(1) 

Dobrą praktyką jest, aby wydrukować tą różnicą, że wystąpił więc można debugować później.

Można również wydrukować stos stosu za pomocą modułu traceback.

Pamiętaj, że int, który powrócisz w sys.exit, będzie kodem powrotu Twojego programu. Aby zobaczyć, co kod zakończenia zwracany program (co daje informacje o tym, co się dzieje i może być zautomatyzowana), można zrobić:

echo $? 
7

Można również umieścić swój kod w funkcji i wydać zwrot. Możesz go nazwać głównym, do którego możesz zadzwonić ze swojego skryptu.

def main(): 
    document = raw_input ('Your document name is ') 

    try: 
     with open(document, 'r') as a: 
      for element in a: 
       print element 

    except: 
     print document, 'does not exist' 
     return 

if __name__ == "__main__": 
    main() 
+0

Problem z "return" w przypadku wyjątków polega na tym, że w wierszu poleceń nie pojawi się żaden kod błędu. Jeśli masz systemy monitorujące, zazwyczaj sprawdzają logi, a także kod powrotu twojego programu, więc jeśli program zwróci 0, we wszystkich przypadkach nawet błędy mogą być trudne do utrzymania. –

+0

@linker Nadal można wydrukować komunikat o błędzie przed powrotem. Nie wszystkie programy muszą wytwarzać dane wyjściowe w innych programach - czasami wystarczy być czytelnym dla ludzi. – agf

+2

@agf Po prostu wyjaśniam, co okazało się najbardziej przydatne w kontekście świata rzeczywistego, najlepiej jest mieć czytelną dla człowieka spójną konwencję kodów powrotu. –

5

Wystarczy je ponownie podnieść. To jest bardziej przyjazny dla dewelopera

document = raw_input ('Your document name is ') 

try: 
    with open(document, 'r') as a: 
     for element in a: 
      print element 

except: 
    print document, 'does not exist' 
    raise 

Sprawdź python document w sekcji Wyjątki Podnoszenie o błędzie re-raise w except.