• Członkowie 12 postów
    4 października 2024 17:15

    Cześć!

    Korzystam z zapisu try/except:

    try:
       # Kod który może sypnąć błędem
    except FirstException:
       handle_first_one()
    
    except SecondException:
       handle_second_one()
    
    except (ThirdException, FourthException, FifthException) as e:
       handle_either_of_3rd_4th_or_5th()
    
    except Exception:
       handle_all_other_exceptions()
    

    Za try mam kilka linii kodu i więcej niż jedna może sypnąć błędem, czy to jest dobre rozwiązanie? Czy lepiej robić wiele bloków try / except jeden po drugim?
    Jak podchodzicie do tematu?

    Drugi sposób poniżej:

    try:
      # Pierwsza funkcja
    except Error1:
      handle_error1()
    
    try:
      # Druga funkcja
    except Error2:
      handle_error2()
    
    try:
      # Trzecia funkcja
    except Error3:
      handle_error1()
    
  • 9 października 2024 22:05

    Ja wolę pierwsze podejście jeśli kodu jest mało i drugie kiedy jest dużo.

  • 16 października 2024 10:35

    Ja podobnie jak @rafalp,ale jeśli dokładnie wiem jakich błędów mogę się spodziewać i np. mam 3 linie (wywołania jakiś metod/funkcji) w try a 2 z nich mogą sypnąć tym samym błędem, to czasem wybieram podejście 2 mimo małej ilości kodu, bo wtedy wiem dokładnie, który fragment kodu powoduje błąd, ale też można to lepiej obsłużyć jeśli jest taka potrzeba/możliwość.

  • Członkowie 3 posty
    2 lutego 2025 14:47

    W przypadku dłuższego kodu, lepiej jest użyć kilku bloków try/except, ponieważ po wystąpieniu wyjątku, dalsza część kodu po try nie jest wykonywana. Do zamykania pliku najlepiej jest użyć finnaly:

    try:
        file=open('Somefile.txt') # Plik nie istnieje, lub brak uprawnień => pojawia się wyjątek i od razu przechodzimy do except
        data=file.read().splitlines() # Wtedy to nie zostanie wykonane
        print(data[999]) # Ta linia też na nic się nie zda
    except FileNotFoundError:
        print('Plik nie istnieje')
    except PermissionError:
        print('Nie masz uprawnień do otwarcia pliku')
    except IndexError:
        print('Nie ma linii o takim numerze')
    finally: # Działania końcowe
        file.close()
    

    Powyższy kod nie jest dobrze zaimplementowany, ponieważ jeżeli wystąpi jakikolwiek wyjątek w instrukcji try, reszta tej instrukcji nie jest wykonywana. Na przykład, gdyby nie było finally, plik nie zostałby zamknięty, a dane zostałyby utracone, jeżeli kod byłby podzielony na kilka bloków try/except, byłoby większe prawdopodobieństwo, że program zakończy swoje działanie bez niepowodzeń.

    Co ważne, nie pisz zbędnego kodu w blokach try/except, jeżeli będziesz tak robił, niepożądane błędy mogę pozostać niezauważone, a tego nie chcemy. Pamiętaj też, że jeżeli wykonujesz operacje na pliku w bloku try/except, na koniec dodaj też finally: file.close() dla bezpiecznego zamknięcia pliku. Instrukcje z finally są wykonywane po bloku try/except niezależnie od tego, czy kod z try zakończył się powodzeniem, czy pojawiły się jakieś błędy, w wyniku których został wykonany kod z któregoś except.

  • Członkowie 12 postów
    10 lutego 2025 17:27

    Dzięki wielkie!