» »

[C#] try - catch

[C#] try - catch

ql000 ::

Zanima me ali je možno loviti Exception-e na naboru akcij, ne pa na posamezni akciji:

torej namesto (spodnja koda) raje kak bolj eleganten try - catch, ki bi mi prišparal štancanje try-catch-ev za vsako akcijo.
Gre za branje iz XML datotek, ki lahko, da imajo zapis na določenem atributu, lahko pa atributa celo ni noter v XML datoteki.
try
                    {
                        MyPartnerDataVar.PartnerDataAccount = tr.Account.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataAccount = "";
                    }

                    try
                    {
                        MyPartnerDataVar.PartnerDataName = tr.Name.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataName= "Ime" + i.ToString();
                    }

                    try
                    {
                        MyPartnerDataVar.PartnerDataAddress = tr.Address.ToString();
                    }
                    catch (System.Exception ex)
                    {
                        MyPartnerDataVar.PartnerDataAddress = "";
                    }

darkolord ::

Najprej, loveljenje System.Exception je ZELO slaba "navada", saj prej ali slej privede do nepredvidenih rezultatov (ker ulovi jasno še vse napake, ki jih nisi pričakoval), pa še zelo počasno je. Lovljenje exceptionov je v bistvu priporočeno samo takrat, kadar lahko pride do napake tam, kjer tega ne moreš predvidet (in na to ne moreš vplivat), to je v glavnem file I/O, network I/O in baze.

No, v tvojem primeru, če so propertiji tr.xxxxx null, lahko tole elegantno rešiš z null coalescing operatorjem (na voljo v C# 2.0+), ki od podanih vrne prvo vrednost, ki ni null:

MyPartnerDataVar.PartnerDataAccount = tr.Account.ToString ?? "";
MyPartnerDataVar.PartnerDataName = tr.Name.ToString() ?? "Ime" + i.ToString();
// ...

Zgodovina sprememb…

ql000 ::

Kaj pa v primeru, ko elementa sploh ni v XML datoteki, občasno se pa pojavlja?

darkolord ::

Na kakšen način ga pa v tem primeru prebereš?

ql000 ::

Ja ravno s try-catch. V tem primeru mi vrne NullReferenceException, in v catchu naredim akcijo. Hec je v tem, da XML nikoli ni populiran na isti način. Polja so ali niso.

joze67 ::

Zakaj pa so ti v C# vrgli if stavek? Če veš, da sa lahko določen element pojavi ali pa ne, je try...catch popolnoma neprimerna programska struktura za reševanje teh težav. Že filozofsko - n gre za nepričakovan dogodek. Pa tudi performančno.

darkolord ::

Ja, če je null, potem lahko narediš tako, kot sem napisal zgoraj (z uporabo operatorja "??") ali pa:
if (polje == null) 
{ 
    // bla bla
}

ql000 ::

@Darklord: jaz te že štekam, samo sprašujem za primere, ko element sploh ni prosoten - je že odgovoril joze67.
Pol imam pa, mogoče za vas bedasto vprašanje, sam še vedno. Zakaj za vraga ima pol človek dano možnost uporabe "slabega pristopa" alias lovlenje Exception-ov? Jaz razumem Exception-e kot mehanizme popisa in reakcij na možne ekscese pri uporabi določenih akcij, pa naj si to bodo razne IO operacije ali pa šarjenje po XML datotekah. Dano ti je orodje, ki ga "ni pametno" uporabiti - tega ne štekam. Sploh me pa bega tisto "že filozofsko"?!?!?!?! Ali mogoče jaz gledam preveč deterministično na stvari?

darkolord ::

Nič ti ne preprečuje, da ne bi exceptionov uporabljal za karkoli ti srce poželi. A izkušnje pravijo, da je to (uporaba vse povprek) zelo slaba praksa. Glavna razloga (že omenjena) sta naslednja:

- performanse, namreč ustvarjanje exceptionov je precej kompliciran postopek (treba je prestavit v kernel mode, zgradit trap frame, obvestit Win32 subsystem o exceptionu, preverit če je attachan debugger, spraskat skupaj stack trace, ...)
- S System.Exception uloviš VSE napake, kar bi v tvojem primeru pomenilo, da bi se zgodilo isto, če fajl sploh ne bi obstajal, če ne bi imel pravic za branje, če ne bi bilo atributa v fajlu, če bi napolnil RAM, ...

Kot je že joze povedal: exception = nekaj izjemnega, nepričakovanega.


Vredno ogleda ...

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

SQL problem

Oddelek: Programiranje
141529 (1147) win64
»

[c#] try/catch, v katerem gradniku je napaka

Oddelek: Programiranje
10950 (688) japol
»

[Visual C#] TableAdapter

Oddelek: Programiranje
61036 (912) detroit
»

pošiljanje SMS C#

Oddelek: Programiranje
132979 (2472) Neon87
»

[C# Linq2SQL]

Oddelek: Programiranje
111245 (1104) BlueRunner

Več podobnih tem