» »

[C#] Izhod iz funkcije

FXMagic ::

Zanima me, kako predčasno izstopit iz funkcije, ki vrača vrednost (v mojem primeru DataSet). Torej jaz imam to funcijo:
public static DataSet MyFunction()
{
    try 
    {
        //neka koda pač 
    }
    catch (Exception ex)
    {
        //če ujame izjemo...izhod iz funkcije
        return;    //error
    }
}


To v primeru, da je funkcija tipa void dela, v mojem primeru, pa morem nekaj vrnit. Kako torej naredit, da se v primeru izjeme, prekine izvajanje funkcije?
  • spremenilo: FXMagic ()

snow ::

Zdej maš dve možnosti:

V tvojo strukturo zapakiraš še en flag, ki pove če je bilo vse ok, ali pa strukturo spreminjaš prek pointerja in vračaš int (error kodo).


V upanju da je to dvoje možno v C#, v C++ se lahko.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

mte ::

vrniti moraš nek DataSet objekt, lahko tudi prazen če to konstruktor tega razreda dopusti

Microsoft ::

Ma jst bi tko naredil, da recimo v exception naredis tole:
DataSet ds = null;
return ds;


In potem tam, ko beres ta dataset, se vprasas, ce je null. Ce je, potem ves, da je prislo do errorja.


by Miha
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr

kopernik ::

Imaš več možnosti (sklepam, da je podobno kot pri Javi) :
1. napake sploh ne ujameš, temveč jo delegiraš naprej (s throws besedico ?) in naj se klicatelj ubada, kaj narediti ob izjemnih situacijah (varianta tega primera je, da napako ujameš in nato vržeš neko lastno definirano napako)
2. napako ujameš in vrneš nedefinirano vrednost (return null;)
3. vračaš nek objekt, ki vsebuje tvoj dataset + nek flag (kot je omenil snow) in če pride do izjeme, ustrezno nastaviš flag

Zgodovina sprememb…

  • spremenil: kopernik ()

Microsoft ::

Ono s throw mislim, da gre recimo takloe:
throw new Exception("EX_DataSet");


by Miha
s8eqaWrumatu*h-+r5wre3$ev_pheNeyut#VUbraS@e2$u5ESwE67&uhukuCh3pr

FXMagic ::

Aha, ok hvala. Sem rešil zdaj, da če je prišlo do izjeme:

DataSet ds = null;
return ds;

OwcA ::

Precej boljše je naprej podati izjemo, ker null kar kliče po kakšnem zahrbtnem hrošču, ko kdaj zanjo pozabiš preveriti. Poleg tega veliko takšnih prverjanj precej napihne kodo.
Otroška radovednost - gonilo napredka.

CWIZO ::

Eedini pravi nacin je da klicatelju vrzes exception.
Razni return null so grdo in slabo programiranje, ki naj bi se ga v OOPju izogibali!

Sploh pa tisto s strukturo, dej ne bluzite prosim no.
hancic.info
I can't uninstall it, there seems to be some kind of "Uninstall Shield"...

snow ::

Mozillin portability guide guide pravi ravno obratno: Ne exceptionov.

Ampak tu gre verjetno za hardcore portabilnost?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

CWIZO ::

Nevem zakaj nebi uporabljal exceptionov.
Govorimo o .NETu in ne o kakem C++ u!!!
hancic.info
I can't uninstall it, there seems to be some kind of "Uninstall Shield"...

snow ::

My bad :\
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

kopernik ::

CWIZO, preden te doleti kap, naj razložim, da sem mu samo naštel nekatere možnosti, ki so povsem legalne in od situacije do situacije ustrezne/neustrezne. Čeprav v tem konkretnem primeru bi tudi jaz kar delegiral napako klicatelju metode ...

CWIZO ::

hehe, kap me pa upam se ne bo pr teh letih no:)

Anways: ostali nacini so tut kdaj recmo lahko qul. Edini un s strukturo. To je pa res ena najvecjih bedarij kar sem jih kdaj slisal.
hancic.info
I can't uninstall it, there seems to be some kind of "Uninstall Shield"...

MaCoFaCo ::

Mogoče se nekoliko pozna pri hitrosti izvajanja: .Net exception performance test

Zaželjeno je recimo, da se čim več stvari preverja z if-i in na ta način preprečimo nepotrebne exceptione. Npr. preden gremo brati datoteko, preverimo če dejansko obstaja, itd.

MaCoFaCo ::

Pakiranje exceptiona v strukturo je lahko tudi kul. En zelo dober primer za to je recimo pri večnivojski arhitekturi sistema. Npr. imaš klienta na enem računalniku, ta pa kliče business logic funkcije na strežniku, torej fizično drugem računalniku. Če pride na strežniku do exceptiona v neki funkciji, moraš to klientu nekako posredovati. En način da to narediš je, da zapakiraš sporočilo exceptiona v neko strukturo, ki se potem posreduje klientu.

kopernik ::

CWIZO,
tudi tisto s strukturo lahko pride prav. Npr. obstajalo je določeno obdobje, ko standard za web service ni bil dorečen kar se tiče napak/izjem (predvsem zaradi nekaterih jezikov, ki tega mehanizma ne poznajo) in zato se je bilo dobro izogibati SoapFault-om, ker je npr. prišlo do razhajanj pri obravnavi le-teh med .NET-om in Javo (sedaj so zadeve že bolj urejene). No, takrat je bila uporaba flagov edina pametna rešitev in ne vidim, zakaj ne bi flagov in drugi podatkov pač zapakiral v kako strukturo, ki se vrača kot rezultat. Seveda, ni to edina rešitev, je pa možna in tudi včasih uporabljena.

CWIZO ::

MaCoFacO: to akr si ti povedal je cist neki drugega, kar so prej predlagal.
Prej so predlagal da ti iz metode vrnes strukturo v kateri so dejanski podatki ki jih rabis in pa nek flag ki ti pove ce se je funkcija pravilno izvrsila.
hancic.info
I can't uninstall it, there seems to be some kind of "Uninstall Shield"...

CWIZO ::

again: za navadne aplikacije to nikakor ni resitev.
Web servisi so pa druga zgodba (kot si rekel)
hancic.info
I can't uninstall it, there seems to be some kind of "Uninstall Shield"...

MaCoFaCo ::

CWIZO: kar sem povedal je ravno to. Da ima funkcija na BL nivoju poleg dejanskih podatkov, predviden še prostor za napake. Takšna struktura se potem serializira v stream (večinoma XML) in na klientu odpakira nazaj v strukturo. Ta potem najprej čekira error polje in če ugotovi da ni prazno, sporoči uporabniku da je prišlo do napake. V nasprotnem primeru se vzamejo podatki in dela z njimi naprej.

CWIZO ::

beri post pred tvojim zadnjim.
hancic.info
I can't uninstall it, there seems to be some kind of "Uninstall Shield"...

MaCoFaCo ::

Hehe, odvisno kako definiraš "navadna aplikacija". In BL nivo sploh ni nujno da je web service.
Res pa je da se to dela samo pri večjih projektih, predstaviti sem samo hotel širši pogled :P


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Vprašanji glede napak pri programiranu

Oddelek: Programiranje
17960 (392) noraguta
»

[C#] ne dodaja podatkov v bazo

Oddelek: Programiranje
9785 (634) cLuBbY
»

[C#] DATA GRID VIEW

Oddelek: Programiranje
131223 (1103) Kekec
»

Kdaj uporabiti izjeme?

Oddelek: Programiranje
24747 (628) Gundolf
»

c# vprasanje

Oddelek: Programiranje
17937 (616) znupy

Več podobnih tem