• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python - Kiedy używać wyjątków a kiedy aseracji a kiedy pętli z warunkiem?

Object Storage Arubacloud
0 głosów
689 wizyt
pytanie zadane 2 grudnia 2018 w Python przez Relezi Nowicjusz (150 p.)

Załóżymy że w moim programie wartość x musi być większa niż 500

Ja tu widzę 3 rozwiązania

1.

assert x < 500, 'Wartość x musi być większa od 500!'

2.

if x < 500: raise Exception('Wartość x musi być więksa od 500!')

3.

while True:
    x = int(input())
    if x < 500: print('Wartość x musi być większa od 500!')
    else: break

Kiedy użyć którego rozwiązania?

2 odpowiedzi

+1 głos
odpowiedź 2 grudnia 2018 przez RafalS VIP (122,820 p.)
Co do roznicy miedzy assert a raise to jest to kwestia preferencji, bo assert i tak rzuca wyjątek AssertionError. Nie ma jednej reguły.

Co do roznicy miedzy wyjatkiem a ifem to wszystko zależy od kontekstu. Pamiętaj jedynie żeby wyjątek zawsze oznaczał wyjątkową sytuacje a nie normalny bieg programu. Np niepoprawne dane to dla walidatora cos normalnego, więc nie powinno sie rzucać tam wyjątkiem tylko zwrocic false w przypadku niepoprawnych danych.

Jest to ogólna zasada programistyczna, ale w pythonie niestety słabo przyjęta, bo ponoć bardziej 'pytonicznie' jest nadużywać wyjątków - np iteracja w zwykłej pętli for nie jest załatwiona ifem tylko wyjątkiem StopIteration.
0 głosów
odpowiedź 2 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
1. Jeśli chcesz jawnie pokazać niezmiennik funkcji i z całą stanowczością załamać program bo nigdy nie oczekujesz że w jakiejkolwiek aplikacji ktoś wołać będzie x z wartością mniejszą niż 500. To że nie zawoła rozwiązujesz w innym miejscu kodu a asercja będzie usunięta z programu jak go uruchomisz z opcją -O (minus Oooo ). Do pliku *.pyc nie trafi zapis asercji. Wtedy zmienna __debug__, będzie miała wartość false. Ogólnie asercji nigdy nie łapiesz (ma swój wyjątek) i pozwalasz im na etapie rozwijania aplikacji załamać działanie aplikacji.

2. Chcesz dać komuś/gdzieś możliwość wykrycia błędu związanego z przetwarzaniem x. Z racji tego że nie da się pisać całości programu jako czyste funkcje (ang. pure function), zawsze gdzieś będzie odkładany w końcu jakiś efekt uboczny (choćby i na konsoli), w języku Python przesyłasz informację o błędzie z użyciem wyjątków.

3. To że x jest mniejsze niż 500, to nie jest nic niezwykłego. Po prostu użytkownik popełnił błąd i należy go o tym poinformować.

Jak się zastanowić, to różnice wcale nie są subtelne. Są bardzo wyraźne.

Podobne pytania

–1 głos
1 odpowiedź 116 wizyt
0 głosów
4 odpowiedzi 641 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez W1ck Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 1,200 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...