Изключения и въпросът за една бира

  1. Днес в края на лекцията (или малко след това) зададохме следния въпрос (за една бира):
    Каква е разликата между rethrow1 и rethrow2:

    # извинявам се за грозното форматиране; пестя място
    def f():
        raise Exception
    
    def rethrow1():
        try: f()
        except: raise
    
    def rethrow2():
        try: f()
        except Exception as ex: raise ex
    

    Получихме отговора: второто създава нова инстанция, а първото хвърля същата...
    ... и не дадохме бирата, а само Сникърс.

    Истината е друга, но ефектът е близък. Не се създава нова инстанция в никой от случаите, но във втория stack-trace-а на изключението се подменя с нов.

    Публикувано преди
  2. Непряко свързано с това, но все пак реших да не отварям нова тема, макар че може и да има смисъл - нека някой друг да реши :)

    За ситуацията с exit(), SystemExit и това, че exit() може да бъде прихванато от except BaseException и "гол" except: оказва се, че наистина и exit() "по подразбиране", и os.exit() имат едно и също поведение - хвърлят изключение SystemExit, което може да бъде хванато от някой по-навън. Това води (поне мен) до три извода:

    1. Хубаво е да знаете какви изключения могат да бъдат хвърлени от функциите и методите, които викате, и да очаквате тях в try..except блокове - т.е. except: или except Exception: или except BaseException: да имате само в наистина изключителни случаи. Както беше казано и на лекцията, "гол" except е общо-взето смислен само и единствено на най-външно ниво във вашия код, на място, където действително смятате, че кодът ви се изпълнява като __main__.
    2. Все пак, ако нещо съвсем и тотално и напълно се обърка и няма начин да бъде оправено по смислен начин от който и да е по-навън, има измъкване - os._exit(). Да се използва само с лекарско предписание :) (най-добре никога, но все пак е добре да се знае, че го има)
    3. Иска ми се да се запозная с човека, на когото е хрумнала идеята, че sys.exit() може да бъде прихващан (а не просто да бъдат добавяни atexit парчета код), и... и...... и дотук съм го измислил. Вероятно ще ми хрумнат и лоши, и хубави неща за причиняване като отмъщение за нанесения ми шок :)
    Публикувано преди
  3. Хубаво де, какъв ти е толкова проблемът за това, че някой може да ти прихваща този exit()?

    След като е решил, че задължително иска да не "крашва" приложението ти, а да прави някакви бакии с него - негова си работа. Ти изрично показваш, че искаш приложението ти да спира, а не просто да хвърли някакъв ексепшън. Ако той прави нещо различно - да се оправя.

    Дори ако пускаш описателен статус на sys.exit(), той може да реагира според него...

    Публикувано преди

Трябва да сте влезли в системата, за да може да отговаряте на теми.