2016-02-05 30 views
6

Podczas korzystania z bloków try/except w języku Python, czy istnieje zalecenie delegowania go do metod, które mogą wywołać wyjątek lub przechwycić go w funkcji nadrzędnej, lub obu?Gdzie umieścić obsługę wyjątków w pythonie

Na przykład, który z poniższych jest preferowany?

def my_function(): 
    s = something.that.might.go_wrong() 
    return s 

def main(): 
    try: 
     s = my_function() 
    except Exception: 
     print "Error" 

lub

def my_function(): 
    try: 
     s = something.that.might.go_wrong() 
     return s 
    except Exception: 
     print "Error" 

def main(): 
    s = my_function() 

PEP 8 wydaje się być cicho w tej sprawie, i wydaje mi się, aby znaleźć przykłady obu przypadkach wszędzie.

Odpowiedz

6

To naprawdę zależy od semantyki omawianych funkcji. Generalnie, jeśli piszesz bibliotekę, prawdopodobnie biblioteka powinna obsługiwać wyjątki, które są zgłaszane w bibliotece (opcjonalnie ponownie zgłaszane jako nowe wyjątki specyficzne dla biblioteki).

Najważniejszą rzeczą, o której myślisz, to jaki kontekst/zakres chcesz obsłużyć w przypadku wyjątku - jeśli istnieje rozsądna inna rzecz, którą możesz zrobić w wyjątkowych przypadkach w ramach funkcji wewnętrznej , może być użyteczne radzenie sobie z nią w funkcji wewnętrznej; w przeciwnym razie rozsądniejsze byłoby posługiwanie się nim w zewnętrznej funkcji.

Dla konkretnego przypadku zapisu wyników, często jest to przydatne tylko w przypadku najwyższego poziomu, a wewnętrzne funkcje zawsze tylko (a) zwracają wartości lub (b) podnoszą wyjątki. To sprawia, że ​​kod jest łatwiejszy do przetestowania, ponieważ nie musisz się martwić o testowanie efektów ubocznych.

+0

Dzięki @Amber. Mówisz dobrze o zdolności testowej, która dobrze pasuje do odpowiedzi od AlokThakura. – mcy

0

Zawsze używam drugiego. Logicznie rzecz biorąc wydaje mi się, że problemy funkcji powinny być rozwiązywane tylko w tej funkcji. Zapewni to użytkownikowi czysty i bezproblemowy interfejs, dzięki czemu można później umieścić swój kod w bibliotece.

Może być kilka przypadków, w których chcesz użyć wyjątków poza funkcją. Na przykład, jeśli chcesz wydrukować konkretną wiadomość, gdy coś pójdzie nie tak, powinieneś użyć wyjątku poza funkcją.

Jednak można podać instrukcje wyjątków jako argument do funkcji, jeśli chcesz dać użytkownikowi możliwość decydowania o swoim wyjątku. Więc myślę, że drugi przykład (wyjątek wewnątrz funkcji) byłby uniwersalny i dlatego powinien być preferowany.

2

Jeśli przestrzegasz zasady "jedna funkcja powinna obsługiwać jedno zadanie", nie powinieneś obsługiwać wyjątków w tej funkcji, Niech wystąpi niepowodzenie głośno przy nieoczekiwanym wprowadzeniu. Funkcja nadrzędna, która wywoływanie takiej funkcji może obsłużyć, aby zapewnić lepszą obsługę użytkownikowi.

Możemy polecić wbudowane funkcje Pythona, aby uzyskać sposób pythonic

+0

Dzięki @AlokThakur. Twoja odpowiedź ma sens i jest ściśle związana z odpowiedzią Amber na temat łatwości testowania funkcji. – mcy