Obsługa błędów czyli jak sobie radzić z prawem Murphy ego

Podobne dokumenty
Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie Obiektowe Ćwiczenie 4

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Konwencje obsługi błędów

Wykład 8: Obsługa Wyjątków

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Programowanie obiektowe

Wyjątki (exceptions)

Aplikacje w środowisku Java

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Zaawansowane programowanie w języku C++ Wyjątki

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Wykład 4: Klasy i Metody

Programowanie w języku C++

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Efekty uboczne błędów

Obsługa wyjątków. Język C++ WW12

DYNAMICZNE PRZYDZIELANIE PAMIECI

Java SE Laboratorium nr 4. Temat: Obsługa wyjątków i zdarzeń

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Delphi Laboratorium 3

Programowanie w języku C++

Programowanie obiektowe

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Dawid Gierszewski Adam Hanasko

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Rozdział 4 KLASY, OBIEKTY, METODY

PARADYGMATY PROGRAMOWANIA Wykład 4

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Multimedia JAVA. Historia

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Tablice, funkcje - wprowadzenie

Programowanie obiektowe

Obsługa wyjątków. Rysunek 2-4 Hierarchia dziedziczenia klas wyjątków

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Podstawy programowania komputerów

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Materiały do zajęć III

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Podstawy i języki programowania

Oracle PL/SQL. Paweł Rajba.

Programowanie obiektowe

Klasy cd. Struktury Interfejsy Wyjątki

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Zaawansowane programowanie w języku C++ Klasy w C++

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Działanie systemu operacyjnego

Składnia C++ Programowanie Obiektowe, część 3 Mateusz Cicheński

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Klasy abstrakcyjne, interfejsy i polimorfizm

Działanie systemu operacyjnego

Programowanie obiektowe

Aplikacje w środowisku Java

Wykład 8: klasy cz. 4

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Gdzie jest moja tabela?

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

Wykład 04. Programowanie obiektowe. Maciej Wołoszyn 17 marca Spis treści

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Szablony funkcji i szablony klas

Wykład 7: Pakiety i Interfejsy

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy PRAWA PRZYJACIÓŁ KLASY. Dostęp z zewnątrz: Dostęp z wewnątrz:

Działanie systemu operacyjnego

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Paradygmaty programowania

Podstawy programowania w języku C++

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Klasyfikacja wyjątków

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Czym są właściwości. Poprawne projektowanie klas

Programowanie poprzez testy z wykorzystaniem JUnit

Dokumentacja do API Javy.

Wywoływanie metod zdalnych

Wstęp do Programowania, laboratorium 02

Programowanie obiektowe

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Podstawy programowania obiektowego

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Java EE produkcja oprogramowania

Struktury. Przykład W8_1

KUP KSIĄŻKĘ NA: PRZYKŁADOWY ROZDZIAŁ KOMUNIKATY DLA UŻYTKOWNIKA

Wstęp do Programowania 2

Co jeszcze mogą nam dać adnotacje? Adam Warski

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

Transkrypt:

Obsługa błędów czyli jak sobie radzić z prawem Murphy ego Daniel Janus http://korpus.pl/ nathell/blog 26 czerwca 2008

Anything that can go wrong, will przypisywane Edwardowi A. Murphy emu (1918 1990)

1 Błędy i bugi

1 Błędy i bugi 2 Obsługa błędów w C

1 Błędy i bugi 2 Obsługa błędów w C 3 Inne języki: wyjątki

1 Błędy i bugi 2 Obsługa błędów w C 3 Inne języki: wyjątki 4 Poza wyjątkami

Co jest błędem, a co bugiem? Błędy konsekwencje prawa Murphy ego: jeśli coś się może nie udać, to się nie uda

Co jest błędem, a co bugiem? Błędy konsekwencje prawa Murphy ego: jeśli coś się może nie udać, to się nie uda Zabraknie pamięci

Co jest błędem, a co bugiem? Błędy konsekwencje prawa Murphy ego: jeśli coś się może nie udać, to się nie uda Zabraknie pamięci Zapis na dysk się nie powiedzie

Co jest błędem, a co bugiem? Błędy konsekwencje prawa Murphy ego: jeśli coś się może nie udać, to się nie uda Zabraknie pamięci Zapis na dysk się nie powiedzie Nie uda się wysłać pakietu w sieć

Co jest błędem, a co bugiem? Błędy konsekwencje prawa Murphy ego: jeśli coś się może nie udać, to się nie uda Zabraknie pamięci Zapis na dysk się nie powiedzie Nie uda się wysłać pakietu w sieć Serwer, z którym rozmawiamy, się wykrzaczy

Co jest błędem, a co bugiem? Błędy konsekwencje prawa Murphy ego: jeśli coś się może nie udać, to się nie uda Zabraknie pamięci Zapis na dysk się nie powiedzie Nie uda się wysłać pakietu w sieć Serwer, z którym rozmawiamy, się wykrzaczy Bugi nieoczekiwane zachowania programu

Co jest błędem, a co bugiem? Błędy konsekwencje prawa Murphy ego: jeśli coś się może nie udać, to się nie uda Zabraknie pamięci Zapis na dysk się nie powiedzie Nie uda się wysłać pakietu w sieć Serwer, z którym rozmawiamy, się wykrzaczy Bugi nieoczekiwane zachowania programu

Powiązanie Błędy niekoniecznie muszą oznaczać bugi, ale nieobsłużenie błędu prawie na pewno spowoduje powstanie buga

Obsługa błędów w C Język C nie ma żadnego dedykowanego mechanizmu kontroli błędów. Jeśli wywołanie funkcji nie powiedzie się, musi ona zwrócić wartość specjalną oznaczającą powstanie błędu.

Obsługa błędów w C Język C nie ma żadnego dedykowanego mechanizmu kontroli błędów. Jeśli wywołanie funkcji nie powiedzie się, musi ona zwrócić wartość specjalną oznaczającą powstanie błędu. Należy zawsze sprawdzać tę wartość.

Obsługa błędów w C Język C nie ma żadnego dedykowanego mechanizmu kontroli błędów. Jeśli wywołanie funkcji nie powiedzie się, musi ona zwrócić wartość specjalną oznaczającą powstanie błędu. Należy zawsze sprawdzać tę wartość. Przykłady malloc() zwraca NULL, jeśli nie udało się przydzielić pamięci Większość funkcji systemowych zwraca -1 w przypadku niepowodzenia i ustawia zmienną errno

Szóste przykazanie 6. If a function be advertised to return an error code in the event of difficulties, thou shalt check for that code, yea, even though the checks triple the size of thy code and produce aches in thy typing fingers, for if thou thinkest it cannot happen to me, the gods shall surely punish thee for thy arrogance. Henry Spencer, The Ten Commandments for C Programmers (Annotated Edition)

Grzechy przeciw szóstemu przykazaniu Grzechy lekkie Kto sprawdza, co zwróciło printf() albo fprintf()?

Grzechy przeciw szóstemu przykazaniu Grzechy lekkie Kto sprawdza, co zwróciło printf() albo fprintf()? Jeśli wypisanie tekstu się nie uda, to rzadko jest sens reagować na taką sytuację inaczej niż ignorując błąd. (Wypisywać komunikat o błędzie? A jeśli znowu się nie uda?)

Grzechy przeciw szóstemu przykazaniu Grzechy lekkie Kto sprawdza, co zwróciło printf() albo fprintf()? Jeśli wypisanie tekstu się nie uda, to rzadko jest sens reagować na taką sytuację inaczej niż ignorując błąd. (Wypisywać komunikat o błędzie? A jeśli znowu się nie uda?) Ale co w sytuacji, gdy piszemy za pomocą fprintf() do pliku opartego via fdopen() na deskryptorze gniazda sieciowego?

Grzechy przeciw szóstemu przykazaniu (cd.)...i cięższe Często zdarza nam się nie sprawdzać wartości malloc().

Grzechy przeciw szóstemu przykazaniu (cd.)...i cięższe Często zdarza nam się nie sprawdzać wartości malloc(). Pod Linuksem to najczęściej nie boli: malloc() rzadko zwraca NULL, co więcej, nawet jeśli zwróci wartość nienullową, nie ma gwarancji, że pamięć jest rzeczywiście dostępna (optymistyczna strategia przydziału).

Grzechy przeciw szóstemu przykazaniu (cd.)...i cięższe Często zdarza nam się nie sprawdzać wartości malloc(). Pod Linuksem to najczęściej nie boli: malloc() rzadko zwraca NULL, co więcej, nawet jeśli zwróci wartość nienullową, nie ma gwarancji, że pamięć jest rzeczywiście dostępna (optymistyczna strategia przydziału)....chyba że parametr VM jądra overcommit_memory jest ustawiony na 2.

Jak sobie zaoszczędzić pisania Wyabstrahować obsługę błędów Jeśli obsługa pewnego rodzaju błędu (np. braku pamięci) jest taka sama w całym programie, to warto umieścić ją w osobnej funkcji.

Wady mechanizmu z C

Wady mechanizmu z C Konieczność żmudnego sprawdzania kodu błędu za każdym razem

Wady mechanizmu z C Konieczność żmudnego sprawdzania kodu błędu za każdym razem Kod każdej nietrywialnej funkcji jest usiany sprawdzeniami

Wady mechanizmu z C Konieczność żmudnego sprawdzania kodu błędu za każdym razem Kod każdej nietrywialnej funkcji jest usiany sprawdzeniami Brak możliwości oddzielenia obsługi błędów od właściwego kodu

Wady mechanizmu z C Konieczność żmudnego sprawdzania kodu błędu za każdym razem Kod każdej nietrywialnej funkcji jest usiany sprawdzeniami Brak możliwości oddzielenia obsługi błędów od właściwego kodu Szczególnie dobrze widać to na przykładzie kodu przydzielającego i używającego kilku zasobów.

Wady mechanizmu z C (cd.) int funkcja() { int retval = -1; resource resource1 = allocate_resource(); if (resource1 == NULL) goto err1; resource resource2 = allocate_resource(); if (resource2 == NULL) goto err2; resource resource3 = allocate_resource(); if (resource3 == NULL) goto err3; if (do_something(resource1, resource2, resource3) == 0) retval = 0; deallocate_resource(resource3); err3: deallocate_resource(resource2); err2: deallocate_resource(resource1); err1: return retval; }

Wyjątki

Wyjątki Mechanizm pozwalający na oddzielenie obsługi błędów od miejsca ich wystąpienia

Wyjątki Mechanizm pozwalający na oddzielenie obsługi błędów od miejsca ich wystąpienia Wprowadzony po raz pierwszy w PL/I ok. 1970

Wyjątki Mechanizm pozwalający na oddzielenie obsługi błędów od miejsca ich wystąpienia Wprowadzony po raz pierwszy w PL/I ok. 1970 try { actual_code(); } catch (exception e) { handle_exception(e); } catch (another_exception e) { handle_another_exception(e); }

Wyjątki Mechanizm pozwalający na oddzielenie obsługi błędów od miejsca ich wystąpienia Wprowadzony po raz pierwszy w PL/I ok. 1970 try { actual_code(); } catch (exception e) { handle_exception(e); } catch (another_exception e) { handle_another_exception(e); } W ciele funkcji actual_code() albo wołanych przez nią funkcyj może pojawić się operacja zwana rzuceniem albo zgłoszeniem wyjątku

Wyjątki Mechanizm pozwalający na oddzielenie obsługi błędów od miejsca ich wystąpienia Wprowadzony po raz pierwszy w PL/I ok. 1970 try { actual_code(); } catch (exception e) { handle_exception(e); } catch (another_exception e) { handle_another_exception(e); } W ciele funkcji actual_code() albo wołanych przez nią funkcyj może pojawić się operacja zwana rzuceniem albo zgłoszeniem wyjątku Powoduje ona zwinięcie stosu do najbliższego odpowiadającego bloku catch

Wyjątki w różnych językach Rodzaje wyjątków

Wyjątki w różnych językach Rodzaje wyjątków W językach obiektowych można definiować klasy wyjątków

Wyjątki w różnych językach Rodzaje wyjątków W językach obiektowych można definiować klasy wyjątków Jeśli dany blok try/catch nie obsługuje wyjątku danej klasy, jest ona pomijana i następuje poszukiwanie handlera wyżej, aż do wierzchołka stosu

Wyjątki w różnych językach Rodzaje wyjątków W językach obiektowych można definiować klasy wyjątków Jeśli dany blok try/catch nie obsługuje wyjątku danej klasy, jest ona pomijana i następuje poszukiwanie handlera wyżej, aż do wierzchołka stosu W Javie wszystkie wyjątki wyprowadzone są z klasy Throwable, a własne należy wyprowadzać z Exception lub jej podklas

Wyjątki w różnych językach Rodzaje wyjątków W językach obiektowych można definiować klasy wyjątków Jeśli dany blok try/catch nie obsługuje wyjątku danej klasy, jest ona pomijana i następuje poszukiwanie handlera wyżej, aż do wierzchołka stosu W Javie wszystkie wyjątki wyprowadzone są z klasy Throwable, a własne należy wyprowadzać z Exception lub jej podklas W C++ rzucane mogą być dowolne obiekty (ale zaleca się wyprowadzanie wyjątków z std::exception)

Wyjątki w różnych językach (cd.) Klauzula finally

Wyjątki w różnych językach (cd.) Klauzula finally Może się pojawić w bloku try po klauzulach catch

Wyjątki w różnych językach (cd.) Klauzula finally Może się pojawić w bloku try po klauzulach catch Kod objęty tą klauzulą wykonywany jest niezależnie od tego, czy ciało bloku try wykona się normalnie czy zostanie rzucony wyjątek

Wyjątki w różnych językach (cd.) Klauzula finally Może się pojawić w bloku try po klauzulach catch Kod objęty tą klauzulą wykonywany jest niezależnie od tego, czy ciało bloku try wykona się normalnie czy zostanie rzucony wyjątek Najczęściej używana do zapewnienia zwalniania zasobów

Wyjątki w różnych językach (cd.) Klauzula finally Może się pojawić w bloku try po klauzulach catch Kod objęty tą klauzulą wykonywany jest niezależnie od tego, czy ciało bloku try wykona się normalnie czy zostanie rzucony wyjątek Najczęściej używana do zapewnienia zwalniania zasobów Dostępna w Javie, C#, Pythonie, Common Lispie (pod nazwą UNWIND-PROTECT) ale nie w OCamlu (choć można ją łatwo dodać za pomocą OCamlowych możliwości rozszerzeń składniowych) ale nie w C++ (który woli używać techniki RAII do zwalniania zasobów)

Resource Acquisition Is Initialization The C++ way Pozyskanie zasobu jest inicjalizacją

Resource Acquisition Is Initialization The C++ way Pozyskanie zasobu jest inicjalizacją Wzorzec projektowy postulujący, że pozyskanie zasobu powinno być powiązane z konstrukcją obiektu, a jego zwolnienie z automatyczną destrukcją

Resource Acquisition Is Initialization The C++ way Pozyskanie zasobu jest inicjalizacją Wzorzec projektowy postulujący, że pozyskanie zasobu powinno być powiązane z konstrukcją obiektu, a jego zwolnienie z automatyczną destrukcją W C++ pamięć traktuje się pod tym względem tak jak każdy inny zasób

Resource Acquisition Is Initialization The C++ way Pozyskanie zasobu jest inicjalizacją Wzorzec projektowy postulujący, że pozyskanie zasobu powinno być powiązane z konstrukcją obiektu, a jego zwolnienie z automatyczną destrukcją W C++ pamięć traktuje się pod tym względem tak jak każdy inny zasób Kłóci się to z odśmiecaniem w językach odśmiecanych programista rzadko troszczy się o czas życia obiektu

Resource Acquisition Is Initialization cd. class resource { private: resource_t res; public: resource() { res = allocate_resource(); } ~resource() { deallocate_resource(res); } }; void funkcja() { try { resource res1, res2; // initialize resources do_something(res1, res2); } catch (...) { std::cerr << "Error!" << std::endl; } }

Wersja z try/finally void funkcja() { try { resource res1 = allocate_resource(); try { resource res2 = allocate_resource(); do_something(res1, res2); } finally { deallocate_resource(res2); } } finally { deallocate_resource(res1); } }

Wersja z try/finally void funkcja() { try { resource res1 = allocate_resource(); try { resource res2 = allocate_resource(); do_something(res1, res2); } finally { deallocate_resource(res2); } } finally { deallocate_resource(res1); } } W niektórych językach (Lisp, Python >= 2.5) można definiować abstrakcje składniowe, pozwalające na napisanie tego samego zwięźlej: (with-resource res1 (with-resource res2 (do-something res1 res2)))

Wyjątki deklarowane W Javie lista wyjątków rzucanych przez metodę jest częścią sygnatury metody. Jeśli metoda próbuje rzucać inne wyjątki niż to deklaruje, to skutkuje to błędem kompilacji.

Wyjątki deklarowane W Javie lista wyjątków rzucanych przez metodę jest częścią sygnatury metody. Jeśli metoda próbuje rzucać inne wyjątki niż to deklaruje, to skutkuje to błędem kompilacji. Mechanizm ten nie stosuje się do wyjątków, których nadklasami są Error lub RuntimeException. Zalety

Wyjątki deklarowane W Javie lista wyjątków rzucanych przez metodę jest częścią sygnatury metody. Jeśli metoda próbuje rzucać inne wyjątki niż to deklaruje, to skutkuje to błędem kompilacji. Mechanizm ten nie stosuje się do wyjątków, których nadklasami są Error lub RuntimeException. Zalety Możliwe sytuacje błędne są częścią kontraktu funkcji

Wyjątki deklarowane W Javie lista wyjątków rzucanych przez metodę jest częścią sygnatury metody. Jeśli metoda próbuje rzucać inne wyjątki niż to deklaruje, to skutkuje to błędem kompilacji. Mechanizm ten nie stosuje się do wyjątków, których nadklasami są Error lub RuntimeException. Zalety Wady Możliwe sytuacje błędne są częścią kontraktu funkcji Znaczne ograniczenie w czasie kompilacji liczby wyjątków docierających do wierzchołka stosu

Wyjątki deklarowane W Javie lista wyjątków rzucanych przez metodę jest częścią sygnatury metody. Jeśli metoda próbuje rzucać inne wyjątki niż to deklaruje, to skutkuje to błędem kompilacji. Mechanizm ten nie stosuje się do wyjątków, których nadklasami są Error lub RuntimeException. Zalety Wady Możliwe sytuacje błędne są częścią kontraktu funkcji Znaczne ograniczenie w czasie kompilacji liczby wyjątków docierających do wierzchołka stosu Zwiększona dyscyplina kontroli wyjątków zachęca do jej obchodzenia nieprzemyślanymi blokami catch

Wady wyjątków

Wady wyjątków Jeśli wywołanie funkcji zakończy się rzuceniem wyjątku (odpowiadającego błędowi), to trudno naprawić to, co się stało, bez znajomości bebechów tej funkcji

Wady wyjątków Jeśli wywołanie funkcji zakończy się rzuceniem wyjątku (odpowiadającego błędowi), to trudno naprawić to, co się stało, bez znajomości bebechów tej funkcji Ale funkcje powinny być czarnymi skrzynkami nie powinno nas obchodzić, jak wywoływana przez nas funkcja wykonuje swoje zadanie

Wady wyjątków Jeśli wywołanie funkcji zakończy się rzuceniem wyjątku (odpowiadającego błędowi), to trudno naprawić to, co się stało, bez znajomości bebechów tej funkcji Ale funkcje powinny być czarnymi skrzynkami nie powinno nas obchodzić, jak wywoływana przez nas funkcja wykonuje swoje zadanie Sytuacja jeszcze się komplikuje, jeśli dany błąd może teoretycznie być obsłużony na wiele możliwych sposobów

Wady wyjątków Jeśli wywołanie funkcji zakończy się rzuceniem wyjątku (odpowiadającego błędowi), to trudno naprawić to, co się stało, bez znajomości bebechów tej funkcji Ale funkcje powinny być czarnymi skrzynkami nie powinno nas obchodzić, jak wywoływana przez nas funkcja wykonuje swoje zadanie Sytuacja jeszcze się komplikuje, jeśli dany błąd może teoretycznie być obsłużony na wiele możliwych sposobów W szczególności, jeśli np. skończyło się miejsce na dysku, to zamiast wyświetlenia komunikatu o błędzie może chcemy wywalić śmieci z /tmp i spróbować jeszcze raz?

Poza wyjątkami: sytuacje i restarty Przychodzi pracownik do szefa i mówi: jest taka sytuacja...

Poza wyjątkami: sytuacje i restarty Przychodzi pracownik do szefa i mówi: jest taka sytuacja... Wyobraźmy sobie, że mamy funkcję Szef(), która wywołuje funkcję Pracownik().

Poza wyjątkami: sytuacje i restarty Przychodzi pracownik do szefa i mówi: jest taka sytuacja... Wyobraźmy sobie, że mamy funkcję Szef(), która wywołuje funkcję Pracownik(). W modelu wyjątków: jeśli ta druga funkcja rzuci wyjątek NieZdazeException, to stos jest natychmiast zwijany i blok catch w funkcji Szef() musi ogarnąć sytuację.

Poza wyjątkami: sytuacje i restarty Przychodzi pracownik do szefa i mówi: jest taka sytuacja... Wyobraźmy sobie, że mamy funkcję Szef(), która wywołuje funkcję Pracownik(). W modelu wyjątków: jeśli ta druga funkcja rzuci wyjątek NieZdazeException, to stos jest natychmiast zwijany i blok catch w funkcji Szef() musi ogarnąć sytuację. Ale może funkcja Pracownik() byłaby w stanie coś zrobić, gdyby Szef() powiedział, jaką strategię wyjścia należy obrać (np. na podstawie priorytetu zadania)?

Poza wyjątkami: sytuacje i restarty Przychodzi pracownik do szefa i mówi: jest taka sytuacja... Wyobraźmy sobie, że mamy funkcję Szef(), która wywołuje funkcję Pracownik(). W modelu wyjątków: jeśli ta druga funkcja rzuci wyjątek NieZdazeException, to stos jest natychmiast zwijany i blok catch w funkcji Szef() musi ogarnąć sytuację. Ale może funkcja Pracownik() byłaby w stanie coś zrobić, gdyby Szef() powiedział, jaką strategię wyjścia należy obrać (np. na podstawie priorytetu zadania)? Na tym opiera się mechanizm sytuacji (conditions): oddzielamy politykę (co zrobić?) od obsługi (jak to zrobić?)

Pseudokod: szef void Szef() { while (task = GetNextTask()) { try { Pracownik(task, task.duedate()); } catch (NieZdaze cond) { if (case.priority == critical) restart cond, zostanpogodzinach; else restart cond, fajrant; } } }

Pseudokod: pracownik void Pracownik(Task task, DateTime duedate) { try { do { perform(task); if (duedate - currentdate() < complexity * (1 - progress(task))) throw NieZdaze; } while (more()); } restart (zostanpogodzinach) { do { bluzg(); perform(task); } while (more()); } restart (fajrant) { } }

Dziękuję za uwagę!