Konwencje obsługi błędów

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

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

Aplikacje w środowisku Java

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

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

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

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

Programowanie Obiektowe Ćwiczenie 4

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

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

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

Programowanie obiektowe

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

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

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

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

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

Klasy cd. Struktury Interfejsy Wyjątki

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

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

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

Wyjątki (exceptions)

Programowanie obiektowe

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

Dawid Gierszewski Adam Hanasko

Materiały do zajęć III

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Efekty uboczne błędów

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Programowanie obiektowe

Klasyfikacja wyjątków

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Programowanie w języku C++

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

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

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

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

Klasy i obiekty cz II

Multimedia JAVA. Historia

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

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

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

Język C++ wykład VIII

PARADYGMATY PROGRAMOWANIA Wykład 4

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Programowanie obiektowe

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

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Klasy abstrakcyjne i interfejsy

Laboratorium 10 - Web Services

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Programowanie w języku Java WYKŁAD

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

11.1 Obsługa błędów i wyjątków Polecenia try, throw, catch CLI C++, klasa Exception... 9

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

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

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

Dziedziczenie jednobazowe, poliformizm

Klasy abstrakcyjne, interfejsy i polimorfizm

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Programowanie poprzez testy z wykorzystaniem JUnit

Generatory. Michał R. Przybyłek

Podstawy i języki programowania

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

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

Enkapsulacja, dziedziczenie, polimorfizm

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

Dziedziczenie. Tomasz Borzyszkowski

Dziedziczenie. dr Jarosław Skaruz

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

PODEJŚCIE OBIEKTOWE. Przykład 1 metody i atrybuty statyczne

Wykład 4: Klasy i Metody

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe

Obsługa błędów w SQL i transakcje. Obsługa błędów w SQL

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Współbieżność w środowisku Java

Materiały do zajęć VII

Remote Method Invocation 17 listopada 2010

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Podstawy programowania obiektowego

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

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Aplikacje w Javie- wykład 11 Wątki-podstawy

Programowanie obiektowe

15. Funkcje i procedury składowane PL/SQL

Podejście obiektowe do budowy systemów rozproszonych

Tworzenie i wykorzystanie usług

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Transkrypt:

Obsługa błędów Rakieta Ariane 5 spadła 40 sekund po starcie. Straty 0,5 miliarda dolarów. Przyczyna: wyjątek (exception) rzucony przez kod napisany pierwotnie dla Ariane 4. Feralna procedura była niepotrzebna w trakcie lotu. Wyniki obliczeń przekroczyły zakres typu short int dla większej rakiety (5) wywołując wyjątek overflow. Nie przewidziano procedury obsługi tego przypadku poniewaŝ nie było szans jego wystąpienia. W Ariane 5 spowodowało to jednak zakończenie programu. Po załamaniu programu sterującego zostały uruchomione komputery zastępcze, ale wszystkie wdraŝały ten sam program...

Obsługa błędów Często niedoceniana i spychana na dalszy plan (etap) realizacji projektu W obsłudze błędów trudno wykazać się kreatywnością, polotem etc. Kod związany z obsługą błędów nie wnosi nowych elementów do programu Powinna być rutynowa, metodyczna... (czyli nudna)

Konwencje obsługi błędów Stosowano róŝne schematy obsługi błędów: Funkcje zwracają kod błędu (Visa Library) Ustawiają specjalną flagę (iberr NI GPIB library) Takie rozwiązania prowadzą do kodu, w którym funkcje podstawowe i obsługa błędów są przemieszane i tym samym słabo czytelne, a ponadto formalnie nie zmuszają programisty do reakcji na te błędy w myśl zasady; błędy przytrafiają się innym, nie mnie Obecnie stosowana koncepcja obsługi wyjątków wywodzi się z rozwiązań stosowanych w systemach operacyjnych w latach 60, on error goto Basica i przez języki Ada oraz C++ trafiła do Javy

Exception handling "Anything that can go wrong will go wrong." An exception handler can return to the instruction that generated the problem This is a dangerous facility to give to an application program An n exception always "abruptly terminates" a statement or sequence of statements in a block and exits to an outer block of code

Definicja Wyjątek (Exception) to zdarzenie występujące w trakcie wykonania programu, które przerywa normalny tok wykonywania instrukcji. W miejscu wystąpienia problemu nie wiadomo co zrobić, nie moŝna zatem kontynuować działania naleŝy je przerwać i przekazać decyzję co dalej robić na wyŝszy poziom

Przyczyny Wiele źródeł błędów moŝe powodować powstanie wyjątków poczynając od uszkodzeń sprzętowych takich jak awaria dysku, do prostych błędów programowych jak próba odwołania do indeksu tablicy wykraczająca poza jej rozmiar. Jeśli taki błąd powstanie wewnątrz metody kreowany jest obiekt wyjątku i przekazywany do systemu wykonania. Obiekt ten zawiera informację o swoim typie i stanie programu, kiedy powstał błąd. System wykonania jest odpowiedzialny za znalezienie kodu obsługi tego błędu. W Javie tworzenie obiektu wyjątku i przekazanie go do systemu wykonania określane jest jako rzucanie wyjątku (throwing an exception).

Przechwytywanie wyjątków Sekwencja wywołania metod przechowywana jest na stosie. System wykonania rozpoczyna poszukiwanie metody, która posiada odpowiednią procedurę obsługi wyjątku (exception handler) poczynając od metody w której powstał wyjątek w kolejności odwrotnej do sekwencji wywoływania metod. Odpowiednia procedura to taka, która obsługuję wyjątek danego typu. O takiej procedurze mówi się, Ŝe przechwyciła wyjątek. Jeśli system wykonania nie znajdzie odpowiedniej procedury obsługi program kończy działanie.

To dla mnie sytuacja wyjątkowa NajpowaŜniejszą zaletą takiego podejścia jest moŝliwość separacji kodu realizującego główne funkcje programu z obsługą potencjalnych błędów. Sytuacja wyjątkowa to taka, w której nie moŝemy kontynuować programu poniewaŝ nie mamy w bieŝącym kontekście wystarczających danych i jedyne co moŝemy zrobić to przerwać wykonanie tego kontekstu i przekazać sterowanie na zewnątrz do procedury obsługi (na wyŝszy poziom).

Rzucanie wyjątku SomeType metoda(object t) { if(t == null) throw new NullPointerException(); //... } Uwagi: 1. Mamy całą hierarchię klas wyjątkowych, której wierzchołkiem jest klasa Throwable i możemy definiować własne wyjątki 2. throw new NullPointerException("t = null"); // 2gi konstruktor 3. metoda zwraca obiekt wyjątku! A nie obiekt SomeType

Instrukcja throw Instrukcja throw jest rodzajem skoku, który przekazuje sterowanie do odpowiedniej części catch w bieŝącej metodzie bądź metodzie wywołującej ją... Metoda, w czasie wykonania której moŝe dojść do sytuacji wyjątkowej (błędu) deklaruje to przez uŝycie throws void f() throws TooBig, TooSmall, DivZero { //... Kompilator, jeśli uŝyjemy metody deklarującej rzucanie wyjątku forsuje nas do jego obsługi Uwaga:Nie dotyczy to RuntimeException

Region chroniony try { // Code that might generate exceptions } catch(type1 id1) { // Handle exceptions of Type1 } catch(type2 id2) { // Handle exceptions of Type2 } catch(type3 id3) { // Handle exceptions of Type3 } // etc... Uwaga: Sterowanie jest przekazywane do pierwszej procedury obsługi wyjątku zgodnej z typem i uznaje się że wyjątek został obsłużony!

Sprzątanie - finally try { // The guarded region: Dangerous activities // that might throw A, B, or C } catch(a a1) { // Handler for situation A } catch(b b1) { // Handler for situation B } catch(c c1) { // Handler for situation C } finally { // Activities that happen every time }

MoŜna oszukać kompilator? Jeśli kod wewnątrz metody moŝe spowodować wyjątek, a nie dostarczymy procedury jego obsługi zostaniemy zdyscyplinowani przez kompilator try { // Code that might generate exceptions } catch(type1 id1) { // Handle exceptions of Type1 } lub moŝemy przekazać obsługę na wyŝszy poziom SomeType metoda () throws Type1 { // Code that might generate exceptions }

MoŜna ale... SomeType metoda () throws Type1 { // Code that does not generate any exceptions // ale będzie, tylko Ŝe teraz skupiamy się na głównym //zadaniu metody // rozwiązujemy zadanie jak wszystko jest ok później dołączymy kod typu: // if something will go wrong } Uwaga: Podobne podejście zastosujemy w klasach abstrakcyjnych i w interfejsach

Termination vs resumption In termination you assume that the error is so critical that there s no way to get back to where the exception occurred. Whoever threw the exception decided that there was no way to salvage the situation, and they don t want to come back. W Javie (podobnie jak w C++) obowiązuje zasada, Ŝe nie ma moŝliwości (sensu) ponowienia wykonania kodu, który rzucił wyjątek. Jeśli uwaŝasz, Ŝe procedura obsługi wyjątku moŝe coś naprawić, co umoŝliwi kontynuowanie wykonania metody nie rzucaj wyjątku ale wywołaj procedurę naprawczą! MoŜna teŝ umieścić try-catch blok w pętli...

Własne klasy wyjątków class MyException2 extends Exception { private int x; public MyException2() {} public MyException2(String msg) { super(msg); } public MyException2(String msg, int x) { super(msg); this.x = x; } public int val() { return x; } public String getmessage() { return "Detail Message: "+ x + " "+ super.getmessage(); } }