CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Globalna obsługa błędów programu...

Globalna obsługa błędów programu...

dział ogólny

Globalna obsługa błędów programu...

Nowy postprzez Slynx » środa, 27 kwietnia 2011, 11:21

Za każdym razem gdy są zapisywane jakieś dane do jednego z plików programu, może wystąpić konkretny błąd, np. plik nie istnieje lub był już wcześniej otwarty. W programie mam wielokrotne zapisy do pliku przez różne funkcje w różnych sytuacjach. Czy można obsłużyć wyjątek, np. typowy I/OException dla całego programu, bez znaczenia z której funkcji czy klasy "powstał" ? Najczęściej w takim wypadku, jeśli błąd nie jest obsłużony dla każdej napisanej funkcji zapisu do pliku, to program się rozpada, a dane użytkownika idą w zapomnienie. Gdybym mógł go wyłapać, wtedy można by dać awaryjny zapis do pliku, czy coś w tym stylu.

Można coś takiego zrobić, czy trzeba każdą szansę wystąpienia obsłużyć indywidualnie ?
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Globalna obsługa błędów programu...

Nowy postprzez Cyfrowy Baron » środa, 27 kwietnia 2011, 12:08

Nigdy o czymś podobnym nie słyszałem. Musisz chyba obsługiwać wszystko indywidualnie...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Globalna obsługa błędów programu...

Nowy postprzez usermaw » niedziela, 1 maja 2011, 20:35

Indywidualnie. Będzie to również zgodne z tym, co podają podręczniki, aby try znajdowało się jak najbliżej miejsca możliwego wystąpienia wyjątku.
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
Podziękował : 2
Otrzymał podziękowań: 0
    Windows XPFirefox

Re: Globalna obsługa błędów programu...

Nowy postprzez Slynx » niedziela, 1 maja 2011, 20:54

Dla mnie blok try catch to ostateczność, staram się raczej przewidywać możliwe wystąpienia niż wyłapywać na ślepo wszystko co się da, dlatego takie globalne łapanie byłoby bardzo przydatne.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Globalna obsługa błędów programu...

Nowy postprzez usermaw » poniedziałek, 2 maja 2011, 20:19

Tu się zgadzam. Try jest głównie do sytuacji całkowicie nieprzewidywalnych i raczej niemozliwych do obsługi "lżejszym" kodem. Moim zdaniem, gdzie się tylko da, obsługiwać warunkami itp. Try pozostawić na ostateczność i opatrznośc ;-) Napchanie try catch w programie może go zauważalnie spowolnić.
A jakby miało wyglądać globalne łapanie różnych wyjątków? Mam na myśli całkowicie globalne, ponadklasowe, ponad przestrzeniami nazw, coś, co czuwa nad aplikacją. Może jakaś wielowątkowośc "nasłuchująca" i czuwająca nad całością...
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
Podziękował : 2
Otrzymał podziękowań: 0
    Windows XPFirefox

Re: Globalna obsługa błędów programu...

Nowy postprzez polymorphism » wtorek, 3 maja 2011, 10:20

Przecież każda aplikacja w VCL-u ma globalne wyłapywanie wyjątków:
KOD cpp:     UKRYJ  
WINAPI WinMain(...)
{
        try
        {
                ...
                Application->Run(); // pętla komunikatów, to stąd wszystkie wyjątki będą pochodzić.
        }
        catch (Exception &exception)
        {
                Application->ShowException(&exception);
        }
        return 0;
}
 

Większość lepszych bibliotek GUI ma taką globalną obsługę wyjątków. Oczywiście każdy wątek, jeśli mówimy o aplikacjach wielowątkowych, musi mieć swoją własną obsługę.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Globalna obsługa błędów programu...

Nowy postprzez Cyfrowy Baron » wtorek, 3 maja 2011, 10:34

Slynx chyba nie to chodzi, nie w takim wymiarze:

Slynx napisał(a):może wystąpić konkretny błąd, np. plik nie istnieje


To, że plik nie istnieje zostanie oczywiście zgłoszone odpowiednim komunikatem błędu w języku angielskim, ale nie da się na to zareagować z poziomu kodu dla konkretnego formularza. Trzeba by zaimplementować obsługę wszystkich takich błędów w bloku, który pokazałeś.

Nie wiem o co dokładnie chodzi Slynx, ale chyba nie o to, gdyż:

Slynx napisał(a):może wystąpić konkretny błąd, np. plik [...] był już wcześniej otwarty


To, że plik był wcześniej otwarty nie jest błędem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Globalna obsługa błędów programu...

Nowy postprzez polymorphism » wtorek, 3 maja 2011, 10:46

Slynx chyba nie to chodzi, nie w takim wymiarze:

Odnosiłem się do tego, co napisał usermaw. No ale nieważne...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Globalna obsługa błędów programu...

Nowy postprzez Slynx » czwartek, 5 maja 2011, 20:44

Przecież każda aplikacja w VCL-u ma globalne wyłapywanie wyjątków:

Zrobienie czegoś takiego jak pokazałeś będzie równoznaczne z tym co mówił usermaw
Napchanie try catch w programie może go zauważalnie spowolnić.

A nie o to mi chodzi, żeby jakaś zewnętrzna konstrukcja (try catch) wisiała nad całą aplikacją. Chodzi bardziej o wyłapywanie W RAZIE wystąpienia, a nie ciągłe OCZEKIWANIE na wystąpienie.
Nie wiem o co dokładnie chodzi Slynx, ale chyba nie o to, gdyż:

Slynx napisał(a):
może wystąpić konkretny błąd, np. plik [...] był już wcześniej otwarty


To, że plik był wcześniej otwarty nie jest błędem.

Z punktu widzenia funkcji - owszem, ale z poziomu błędu programisty - wiadomo. Numer bardzo znany z Pascala, gdzie niezamknięcie pliku (Close)powodowało od razu błąd krytyczny i dane "bye bye".
Slynx chyba nie to chodzi, nie w takim wymiarze:

Slynx napisał(a):
może wystąpić konkretny błąd, np. plik nie istnieje


To, że plik nie istnieje zostanie oczywiście zgłoszone odpowiednim komunikatem błędu w języku angielskim, ale nie da się na to zareagować z poziomu kodu dla konkretnego formularza. Trzeba by zaimplementować obsługę wszystkich takich błędów w bloku, który pokazałeś.

O tym właśnie mówiłem. O globalnym wyłapaniu ewentualnego wystąpienia. Problem jest bardzo prosty, ale rozwiązanie może być trochę trudne. Dlaczego tylko trudne ? Bo chyba wiem jak to zrobić. Muszę jeszcze sprawdzić parę rzeczy i możliwe, że będzie można zwyczajnie odpalić dodatkową klasę, działającą w tle, która będzie wyłapywać błędy. Na razie jednak trochę kombinuje, bo takie rozwiązanie może być gorsze i mniej optymalne od konstrukcji try catch. Muszę trochę pogrzebać na msdn, jak znajdę chwilę czasu.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Globalna obsługa błędów programu...

Nowy postprzez Slynx » niedziela, 12 czerwca 2011, 15:27

Powracam do tematu, ale w trochę innej formie.
Wszystkie funkcje mają już pewną obsługę, wyrzucają błędy tylko... no właśnie, jeszcze nie wiem gdzie mają je wyrzucać. Stworzyłem specjalną klasę do obsługi tego, wraz z identyfikatorami i przypisanymi tekstowymi błędami, co pozwoli później na ewentualne łatwe przygotowanie innej wersji językowej (polskiej :D). Co jest problemem...
Wcześniej każda funkcja zwracała albo String^ z informacjami od funkcji albo ewentualny błąd z klasy błędów (static Error class), ale teraz zauważyłem, że to zły pomysł, bo niektóre funkcje nie zwracają typu String^, a jakieś własne tablice danego typu.
Jak na razie wykombinowałem, że można zmodyfikować klasę Error, żeby zawierała pewne dodatkowe funkcje, np.
KOD cpp:     UKRYJ  
Error::AddErrorMessage("Wiadomość", typ);
 

Bardzo przydatne byłoby np. informacja z klasy od której błąd pochodzi. To przy okazji obsłużyło by globalny Log programu. Oczywiście miejsce na przechowywanie to jakiś stos lub lista.
Co o tym myślicie ? Ma ktoś jakiś lepszy pomysł ?
C# nie ma tego problemu, throw exception i tyle...
Przy okazji, miałem zapytać jeszcze o coś.
KOD cpp:     UKRYJ  
Void break_()
{
 /// jakiś kod
}
 

KOD cpp:     UKRYJ  
void while_()
{
    int i = 0;
    while (1)
        {
        i++;
        if (i == 10) break_();
        }
}
 

Pytanie: Czy funkcja break_ może przerwać pętle w której została wywołana ? Czyli, czy można tak napisać tą funkcję break_, że gdy zostanie wywołana w pętli funkcji w której została wywołana(czyli while_()) - przerwie ją ?
Jeśli nie zrozumiałe... Czy funkcja break_() może zawierać break; który przerwie pętlę jeśli funkcja została w niej wywołana ?

----
Jeśli chodzi o to pierwsze, to w sumie już nie ważne. Wspomogłem się nullptr. No chyba, że ktoś ma jakiś na prawdę błyskotliwy pomysł ; )
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Globalna obsługa błędów programu...

Nowy postprzez polymorphism » niedziela, 12 czerwca 2011, 21:24

Jeśli chodzi o break_, odpowiedź brzmi: nie, chyba że rzucisz wyjątkiem lub po prostu zwrócisz wartość, która spowoduje przerwanie pętli w konwencjonalny sposób.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości

cron