Zdravím,
mám menší problém, mám napísanú metodu, ktorá mi vracia string, aby ho vrátila mám v bloku try, v bloku catch mám jednoduchý objekt Logger,ktorý mi zapisuje chybu do .txt súboru.
Keď sa pokúsim skompilovať, vyhodí mi chybu typu , že "nie všetky časti kodu vracajú hodnotu string"...
Ošetril som to tým, že som do catch po použití Logger objektu napísal "throw", ale to presne nechcem.
Chcel by som vlastne ak nejaká výnimka sa vybudí, tak aby napísalo messageBox aby mi poslal ten a ten súbor a vyplo aplikáciu.
Mohol by mi niekto aspoň cca ukázať ako na to? Resp. ako spraviť to, aby som tam nedal do catch bloku "throw"
Vopred díky
Fórum › .NET
Try-catch v metode s navratovou hodnotou
Zdravím,
vzhledem k tomu, že si neposlal ukázku oné metody (proč?), tak pouze teoreticky. Metoda s návratovou hodnotou musí "vždy" něco vracet. Pokud v té metodě používáš nějakou formu větvení (podmínky, try-catch, ..), musíš v každé z této větve něco vrátit (nebo provést nějaké operace a vrátit výslednou hodnotu na konci). Když přidáš ten kód, napíšu víc.
No hlavně se musíš rozhodnout, co to má dělat, když dojde k výjimce. Volajícímu tvé metody jsi slíbil, že dostane string, žejo. Takže buď rovnou v tom bloku catch aplikaci ukončit, nebo vrátit nějakou hodnotu (jenže to pak volající nepozná, že něco je špatně) nebo výjimku chytat někde jinde.
To Quiark : Jde o to, jestli volající v daném případě potřebuje vědět, že je něco špatně.
pardon páni, bol som "ponáhľaný" na prednášku, zabudol som na kód, dám len podstatnú časť:
public List<Searchresult> SearchResultByName(string pName)
{
link = "";
XML = "";
link = LinkFormatter.SearchByName(pName);
List<Searchresult> searchReslt = new List<Searchresult>();
try
{
XML = myWClient.DownloadString(link); //toto je webclient na downlaod stringu
searchReslt = myXMLExtracter.SearchResultExtract(XML); //spraucje stiahnuté xml a vyextrahuje z neho čo potrebujem
return searchReslt;
}
catch (Exception ex)
{
log.ErrorWrite(ex, folderOrg.LogFolder()); //ulozi mi exception do .txt súboru, toto mi funguje bez problemov
throw;
//A tu miesto toho aby som mal "throw", by som chcel vypnúť aplikáciu a zobraziť správu aby mi poslal mailom súbor,
//ktorý je vytvorený tým log.ErrorWrite
}
}
to co resis je principialne uplne mimo OOP ..
princip je takovy, ze kdyz tvrdis ze ma neco vratit string, tak ho taky mas vratit (ze kteryhokoliv rozvetveni...) a to tam ted proste nedelas.. mas cast, kde to skonci, a neexistuje zadna definovana hodnota co to vrati.. (coz si tu ohlida kompilator ) ale v nekterych jinych jazycich to uz muze udelat neskutecnou paseku
yterbium napsal:
a je niečo také "principiálne" správne?
či to neruší nejaké princípy OOP, lebo keď už programujem tak aspoň správne sa snažiť...
Čiže toto je vo všeobecnosti odporúčaný postup?
Tak s tymto absolutne nesulhasim. Ak je program riadeny vynimkami, tak nezalezi vobec na tom, ci tam nieco vratis alebo nie (najde sa to aj v kode od M$):
try
{
IntSecurity.AllWindows.Demand();
}
catch (SecurityException)
{
this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestricted] = true;
}
catch
{
this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestricted] = true; // To be on the safe side
this.dataGridViewState1[DATAGRIDVIEWSTATE1_isRestrictedChecked] = true;
throw;
}
Nepouzivat vynimky moze kod znacne zneprehladnit, pretoze sa budu musiet zavadzat pri kazdej navratovej hodnote kody, ktore urcia, ze vysledok vlastne nie je spravny. Takymto pohladom som sa uz stretol ked som refaktoroval jednu serverovu aplikaciu ktora sa spravala "divne" a nebola takmer vobec rozsiritelna (mala len 200.000 riadkov) - cely problem bol v nepochopeni a nepouzivani vynimiek. Po refaktoringu (trval 2 roky => znacne drahy) sa aplikacia sprava "ocakavatelne" a je rozsiritelna.
Diskutoval by som skor o tom, ci raisovat vynimku v konstruktore alebo destruktore (leaky), ale v metode nevidim absolutne ziaden problem.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Metoda s návratovou hodnotou typu Array — založil Kalgys
[C#] Pristup k metode — založil Roxtoon
Zistenie triedy v statickej metóde — založil Prog.
NetBeans 13 a nové řádky po metodě — založil Michwuanquana
Zavolanie metody v inej metode — založil marioff
Moderátoři diskuze