Diskuze: Céčko: Ošetření chyby ve funkci

C++ C a C++ Céčko: Ošetření chyby ve funkci

Avatar
Bertram
Člen
Avatar
Bertram:

Ahoj, mám ze zadání pomocí procedury error ošetřit neexistující data, které načítá a vrací funkce. Neboli, pokud data jsou, vrátím je jako návratovou hodnotu, pokud nejsou volám proceduru error.
Můj problém je, že nevím co si mám pod tou procedurou představit. Poradíte?

 
Odpovědět 31.3.2015 16:04
Avatar
Libor Šimo (libcosenior):

In C programming, all executable code resides within a function. A function is a named block of code that performs a task and then returns control to a caller. Note that other programming languages may distinguish between a "function", "subroutine", "subprogram", "procedure", or "method" -- in C, these are all functions.

Nahoru Odpovědět 1.4.2015 6:55
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Bertram
Člen
Avatar
Bertram:

Ok, to bych věděl. Ale přemýšlím, jak to s tou další funkcí zařídit. Jsem totiž uvnitř funkce, která má vracet vlastní datový typ, konkrétně jde o strukturu. V této funkci zjistím, že nemám co vracet a mám tedy volat další funkci (proceduru error), která bude vracet, nebo také ne svou návratovou hodnotu. Tu mi vrátí do místa volání, tedy do funkce, která stále ještě nevrátila tu strukturu, která se od ní čeká v návratové hodnotě. Zkrátka, kdybych měl k dispozici například vyjímky, tak bych si poradil. Nebo kdybych si to mohl udělat po svém, tak bych první zjistil, zda data existují a až potom volal funkci, která by je vrátila. Ale zadání je takové, že mám funkci zavolat a pokud data nejsou, tak volat proceduru error. A jak z toho vybruslit, když mám do místa volání funkce vrátit struktůru? To ji mám vrátit prázdnou a pomocí té chybové krmit nějakou globální proměnnou? To mi nepříjde elegantní. Zkrátka nevím, jak to touto cestou řešit. Pokud někdo ano proraďte prosím.

 
Nahoru Odpovědět 1.4.2015 7:20
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Bertram
David Novák:

Tak "procedurou" může být myšlena funkce s návratovou hodnotou void (nic nevrací)..
nevím, co máš povolené a co ne.. Ale obvykle můžeš mít nějakou tu fci error, kterou zavoláš, ta vypíše chybu na stderr a zavolá exit s nějakým chybovým kódem (jsou nějaké zvyklosti, ale většinou stačí vracet jedničku)
Pokud bys dělal toto (a máš někde nějaký malloc nebo tak), tak bys to měl před samotným voláním error uvolnit..

...
if(!(data = fopen(filename, "r")))  // pokud nelze otevřít soubor
{
// tu přidat jakékoliv uvolňování paměti nebo zavření otevřených souborů (může být i přímo v error)
  error();
}
...

a fce error:

void error(void)
{
  fprintf(stderr, "Nastala chyba.");
  exit(1);
}

Podmínku pro neexistenci dat si samozřejmě udělej, jakou potřebuješ.. A ten error jde taky trochu víc promakat.. například mu můžeš posílat string, který by měl vytisknout.. Nebo nějaký chybový kód podle kterého vytiskne (a udělá) konkrétní věc.. ;)

Druhý způsob, jak by to šlo:

...
if(!(data = fopen(filename, "r")))  // pokud nelze otevřít soubor
{
// tu přidat jakékoliv uvolňování paměti nebo zavření otevřených souborů (může být i přímo v error)
  error("Soubor nelze otevřít!");
  return NULL;
}
...

V error bys jen vypisoval chybu (to už ale rovnou můžeš použít rovnou sem fprintf a hotovo.. ale kvůli dodržení zadání.. :D )

Pak bys ovšem musel ještě přidat ošetření k volání té funkce, kde zpracováváš data..

...
if(!funkce(...)) // jestli se fce "nepovedla" - vrátila NULL
 return 1; // nebo jakýkoliv vybraný chybový kód kromě 0
...

Vyber si, co je ti milejší.. ;)
Ale nejspíš budeš muset pokaždé použít return nebo exit - takže záleží, co máte v zadání.. Někdy se exit zakazuje.. Teoreticky bys mohl ošetřovat chyby pomocí goto, ale to by tě asi učitel neměl rád a na 99% to máte zakázané ;) :D
Jo a při té chybě nezapomeň uvolnit všechnu alokovanou paměť a uzavřít otevřené soubory! (i když to není při ukončování programu úplně nutné a většinou se o to postará OS, tak si na to u C/C++ zvykej.. mohl bys někdy programovat nějaký embedded, kde nebude automatické uložení rozpracovaných souborů apod.)

Nahoru Odpovědět 1.4.2015 8:40
Chyba je mezi klávesnicí a židlí.
Avatar
Bertram
Člen
Avatar
Bertram:

Děkuji za reakce.

Vyřešeno viz níže, jak se to bude líbit uvidíme :)

void copyDataError (List_t* list, const char* message){
        printf("Chyba: %s\n", message);

        ...

        exit(EXIT_FAILURE);
}
 
Nahoru Odpovědět 1.4.2015 11:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.