• 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?

0 głosów
114 wizyt
pytanie zadane 2 grudnia 2018 w Python, Django 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 (112,500 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.
+1 głos
odpowiedź 2 grudnia 2018 przez mokrowski VIP (107,720 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

0 głosów
3 odpowiedzi 92 wizyt
0 głosów
1 odpowiedź 47 wizyt
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

64,865 zapytań

111,325 odpowiedzi

234,206 komentarzy

46,727 pasjonatów

Przeglądających: 227
Pasjonatów: 7 Gości: 220

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...