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
Odpowiedz
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.
assert cond, "text"
rozpręża się do czegoś jak
if cond == False:
raise AssertionError("text")
użytkowania dochodzić, ponieważ jest bardziej czytelny.
Wielkie dzięki! Teraz ma więcej sensu! – Defneit
Krótkie i chrupiące, dzięki :) –
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ć.
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]))
Dziękuję bardzo! Teraz mogę nadal tworzyć kodowanie dzięki tobie! – Defneit
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.
Dziękuję bardzo człowieku. Pomógł mi bardzo – Defneit
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ł.
Dziękuję bardzo – Defneit
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
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
@Defneit Istnieją takie przykłady w dokumentacji Pythona. Powinieneś także zadać pytanie w pytaniu, a nie w komentarzu. – Goyo