2016-10-21 20 views
6

Tak więc od pewnego czasu uczę się Pythona, a funkcja podbijania i assert są (zdałem sobie sprawę, że oba z nich powodują awarię aplikacji, w przeciwieństwie do wypróbowania - z wyjątkiem) naprawdę podobne i nie mogę zobacz sytuację, w której używałbyś Raise lub Assert over Try.Różnica między Podnieś Próbę i Asembler

+1

Zakładasz, że istnieje wybór między użyciem podbicia, potwierdzenia lub próby, ale w rzeczywistości nie są one zamienne. Również nie zadałeś pytania. – tcooc

+1

Dzięki tcoc! Rzeczywiście miałem jednak pytanie, czy ktoś mógłby mi pokazać sytuację, w której można użyć tylko jednej z tych funkcji. – Defneit

+1

@Defneit Istnieją takie przykłady w dokumentacji Pythona. Powinieneś także zadać pytanie w pytaniu, a nie w komentarzu. – Goyo

Odpowiedz

7

Assert:

Używane, gdy chcemy "stop" scenariusz na podstawie pewnego stanu i coś powrócić pomóc debug szybciej:

list_ = ["a","b","x"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> prints passed 

list_ = ["a","b","c"] 
assert "x" in list_, "x is not in the list" 
print("passed") 
#>> 
Traceback (most recent call last): 
    File "python", line 2, in <module> 
AssertionError: x is not in the list 

podbicie:

Two powody, które są przydatne:

1/Do użycia z blokami try i except. Podnieś wybrany błąd, który może być niestandardowy, jak poniżej, i nie zatrzymuje skryptu, jeśli skrypt jest pass lub contiune; lub mogą być predefiniowane błędy raise ValueError()

class Custom_error(BaseException): 
    pass 

try: 
    print("hello") 
    raise Custom_error 
    print("world") 
except Custom_error: 
    print("found it not stopping now") 

print("im outside") 

>> hello 
>> found it not stopping now 
>> im outside 

zauważyłem, że nie zatrzymał? Możemy to zatrzymać, używając wyjścia (1) w bloku except.

2/Raise można również użyć do zmiany bieżącego błędu, aby przekazać go do stosu, aby sprawdzić, czy coś innego może sobie z nim poradzić.

except SomeError, e: 
    if not can_handle(e): 
      raise 
    someone_take_care_of_it(e) 

try/wyjątkiem bloków:

robi dokładnie to, co myślisz, próbuje coś, jeśli błąd pojawia się go złapać i jak sobie z nim kiedykolwiek chcesz. Bez przykładu, ponieważ jest jeden powyżej.

4
assert cond, "text" 

rozpręża się do czegoś jak

if cond == False: 
    raise AssertionError("text") 

użytkowania dochodzić, ponieważ jest bardziej czytelny.

+0

Wielkie dzięki! Teraz ma więcej sensu! – Defneit

+0

Krótkie i chrupiące, dzięki :) –

5

raise - Podnieść wyjątek.

assert - Podniesienie wyjątku jeśli dany warunek jest (lub nie jest) prawdziwy.

- wykonać kod, który może podnieść wyjątek, a jeśli tak, to go złapać.

1

Wyjątki to to, czego Python (i kilka innych języków) używa, aby poradzić sobie z błędami, które pojawiają się podczas wykonywania kodu. raise ExceptionName mówi, że wystąpił błąd w kodzie i określa, jaki to jest problem, podnosząc wyjątek powiązany z tym problemem. assert expression oceń expression i wywołaj wyjątek, jeśli jest on fałszywy.

służy do wykonywania kodu, który może wywołać wyjątek, którego się spodziewasz. Zamiast zatrzymywać program, możesz "złapać" wyjątek i zająć się nim w swoim kodzie.

Przykład: Załóżmy, że masz słownik i listę. Chcesz wyglądać rzeczy z listy w słowniku aż do jednego, że nie ma w słowniku:

try: 
    for item in my_list: 
     print(my_dictionary[item]) 
except KeyError as e: #KeyError is the Exception raised when a key is not in a dictionary 
    print('There is no {} in the dictionary'.format(e.args[0])) 
+0

Dziękuję bardzo! Teraz mogę nadal tworzyć kodowanie dzięki tobie! – Defneit

3

try/except bloki pozwolić złapać i zarządzać wyjątków. Wyjątki mogą być wywoływane przez raise, assert i dużą liczbę błędów, takich jak próba indeksowania pustej listy. raise jest zwykle używany, gdy wykryto warunek błędu. assert jest podobny, ale wyjątek jest podniesiony tylko wtedy, gdy warunek jest spełniony.

raise i assert mają inną filozofię. Istnieje wiele "normalnych" błędów w kodzie wykrywanym i zgłaszanym przez błędy. Być może strona internetowa nie istnieje lub wartość parametru jest poza zakresem.

Asercje są generalnie zarezerwowane dla "przysięgam, że nie mogą się zdarzyć", które i tak zdarzą się. Jest bardziej podobny do debugowania w czasie wykonywania niż zwykłe wykrywanie błędów w czasie wykonywania. Asercje mogą być wyłączone, jeśli używasz flagi -O lub używają plików .pyo zamiast .pyc, więc nie powinny być częścią zwykłego wykrywania błędów.

Jeśli kod jakości produkcji zgłasza wyjątek, sprawdź, co zrobiłeś źle. Jeśli podniesie to AssertionError, masz większy problem.

+0

Dziękuję bardzo człowieku. Pomógł mi bardzo – Defneit

1

Assert jest powszechnie używany przez testowania kodu, aby upewnić się, że coś działało:

def test_bool(): 
    assert True != False 

Gdzie jak spróbować podnieść i oprócz makijażu obsługi wyjątków, które jest preferowanym sposobem w Pythonie do manipulacji i propagować błędów.

Większość bibliotek i wbudowanych w Pythona zostanie podniesionych, a Wyjątek jednego lub drugiego typu, jeśli coś pójdzie nie tak. Często we własnym kodzie powinieneś również zgłosić wyjątek, gdy wykryjesz, że coś poszło nie tak. Załóżmy na przykład, że piszesz narzędzie do sprawdzania adresów e-mail i chcesz zgłosić wyjątek, jeśli adres nie zawiera znaku @. można mieć coś takiego (to kod zabawka, nie faktycznie potwierdzić e-maile takie jak ten):

def validate_email(address): 
    if not "@" in address: 
     raise ValueError("Email Addresses must contain @ sign") 

Potem gdzieś w kodzie można wywołać funkcję validate_email a jeśli to się nie powiedzie wyjątek zostanie rzucony.

Ważne jest, aby podczas wywoływania wyjątku przekazywać stos wywołań do momentu znalezienia programu obsługi. Jeśli nigdy nie znajdzie programu obsługi, spowoduje awarię programu z wyjątkiem i śledzeniem stosu.

Jedno nie chcesz zrobić, to coś takiego:

if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     pass 

Teraz nie masz możliwości dowiedzenia się, dlaczego aplikacja wysadzili.

Jedno widać często co jest ok to coś w rodzaju:

import logging 
if __name__ == '__main__': 
    try: 
     print(1/0) 
    except Exception as ex: 
     logging.exception(ex) 
     raise 

Podwyższenie w tym przypadku, ponieważ nie ma parametry przebije ten sam błąd. Często w kodzie sieciowym zobaczysz coś podobnego, co nie spowoduje ponownego podniesienia wyjątku, ponieważ spowoduje wysłanie błędu 500 do klienta, a następnie kontynuowanie go z następnym żądaniem, więc w takim przypadku nie chcesz, aby program się kończył.

+0

Dziękuję bardzo – Defneit