[ Jordan90 @ 19.12.2012. 10:34 ] @
Imam problem sa exceptionima , tj sa hvatanjem istih. Naime,radim softver sa unosom osoba u bazu,i imam klasu Osoba koja ima neke svoje atribute i imam metodu validacija koja vrsi validaciju prilikom unosa podataka u textbox.

string imeNosioca;
string prezimeNosioca;
string uplataDo;
private void validacijaImena(string ime)
{
if(ime == string.Empty)

throw new Exception("Morate uneti ime nosioca !");

}

private void validacijaPrezimena(string prezime)
{
if(prezime == string.Empty)
throw new Exception("Morate uneti prezime nosioca");
}


private void validacijaUplate(string uplata)
{
int datumUplate = Convert.ToInt32(uplata);
if(DateTime.Now.Year > datumUplate)
throw new Exception("Datum vazenja uplate ne sme biti manji od tekuceg datuma !");
}

public void Validiraj()
{
validacijaImena(imeNosioca);
validacijaPrezimena(prezimeNosioca);
validacijaUplate(uplataDo);
}


Ono sto me sad interesuje jeste kako da u glavnoj formi,kada radim unos preko textboxova da hvatam ove exceptione i ispisujem poruke koje su vec gore navedene? U javi je to recimo

try
{
//neki kod
}
catch(Exception ex)
{
MessageBox(ex.getMessage());
}

Kako je to u C#?
Molim vas pomoc......

Hvala



[ Dusan Kondic @ 19.12.2012. 11:14 ] @
Postoji jako mnogo rešenja a sve zavisi od toga kakav ishod (greška) se očekuje.
U narednom primeru nije potreban ni try/catch ni throw ali lako mogu da se uvedu.
Code:


        string imeNosioca;
        string prezimeNosioca;
        string uplataDo;
        private Exception validacijaImena(string ime)
        {
            Exception ex = new Exception("");
            if (ime == string.Empty) ex = new Exception("Morate uneti ime nosioca! ");
            return ex;
        }
        private Exception validacijaPrezimena(string prezime)
        {
            Exception ex = new Exception("");
            if (prezime == string.Empty) ex = new Exception("Morate uneti prezime nosioca. ");
            return ex;
        }
        private Exception validacijaUplate(string uplata)
        {
            Exception ex = new Exception("");
            int datumUplate = Convert.ToInt32(uplata);
            if (DateTime.Now.Year > datumUplate) ex = new Exception("Datum vazenja uplate ne sme biti manji od tekuceg datuma! ");
            return ex;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string messageText = validacijaImena("Milan").Message;
            messageText += validacijaPrezimena("").Message;
            messageText += validacijaUplate("2010").Message;

            if(messageText != "") MessageBox.Show(messageText);
        }

Nadam se da je ovo pomoglo.
[ Jordan90 @ 19.12.2012. 11:28 ] @
Svidja mi se resenje sad cu da probam da implementiram... A postoji li mogucnost samo da u metodi button_click(object sender,.....)
ja napravim try/catch blok u kome bih hvatao vec definisane exceptione... Mislim da bi mi to dosta smanjilo posao? Trazio sam po netu ali nema odgovora.... Ili ne postoji mogucnost da to sredim na taj nacin?
[ Dusan Kondic @ 19.12.2012. 12:31 ] @
try/catch možeš da staviš npr. kod konverzije u Int32 jer tu možemo da očekujemo prosleđivanje neodgovarajućeg podatka.
U tom slučaju kod može da izgleda ovako:
Code:

        string imeNosioca;
        string prezimeNosioca;
        string uplataDo;
        private Exception validacijaImena(string ime)
        {
            Exception ex = new Exception("");
            if (ime == string.Empty) ex = new Exception("Morate uneti ime nosioca! ");
            return ex;
        }
        private Exception validacijaPrezimena(string prezime)
        {
            Exception ex = new Exception("");
            if (prezime == string.Empty) ex = new Exception("Morate uneti prezime nosioca. ");
            return ex;
        }
        private void validacijaUplate(string uplata)
        {
            int datumUplate = Convert.ToInt32(uplata);
            if (DateTime.Now.Year > datumUplate)
                throw new Exception("Datum vazenja uplate ne sme biti manji od tekuceg datuma! ");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string messageText = validacijaImena("Milan").Message;
            messageText += validacijaPrezimena("").Message;
            try
            {
                validacijaUplate("asdf");
            }
            catch (Exception ex)
            {
                messageText += ex.Message;
            }

            if (messageText != "") MessageBox.Show(messageText);
        }
[ ravni @ 19.12.2012. 12:40 ] @
Citat:
Jordan90:... U javi je to recimo

try
{
//neki kod
}
catch(Exception ex)
{
MessageBox(ex.getMessage());
}

Kako je to u C#?

U C# bi to bilo
Code:
try
{
  // neki kod
}
catch(Exception e)
{
  MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
}
[ Jordan90 @ 19.12.2012. 13:23 ] @
Ok je,ali u message boxu se i dalje ispisuje sistemska poruka o gresci,a ja bih zeleo samo da se isppise neki zadati string ? Interesuje me jel postoji to uopste u .netu?
[ ravni @ 19.12.2012. 13:42 ] @
Code (csharp):
MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
[ plague @ 19.12.2012. 14:22 ] @
Citat:
Jordan90:
Ok je,ali u message boxu se i dalje ispisuje sistemska poruka o gresci,a ja bih zeleo samo da se isppise neki zadati string ? Interesuje me jel postoji to uopste u .netu?

Naravno da postoji, cak si i sam napisao
Code (csharp):

throw new Exception("Datum vazenja uplate ne sme biti manji od tekuceg datuma !");

Posle da bi je prikazao koristis:
Code (csharp):

catch(Exception ex)
{
      MessageBox.Show(ex.Message);
}
 
[ Dejan Carić @ 21.12.2012. 09:34 ] @
@Jordan90

Nisam dugo radio desktop programiranje pa ti ne mogu dati konkretan odgovor ali evo par smernica...

Bitno je gde se radi validacija. Na klijentu ili serveru (prezentacioni sloj ili sloj poslovne logike)? Exception predstavlja alarmantno stanje aplikacije: desilo se nešto što nisi mogao da hendluješ prilikom unosa podata. Na prezentacionom sloju, možeš da pogledaš IDataErrorInfo i INotifyPropertyChanged interfejse. Naći ćeš dosta primera na internetu... Nema potrebe za bacanjem exception-a kada je dovoljno da samo ispišeš poruku da podaci nisu validni.

Kada si uradio validaciju podataka na prezentacionom sloju, onda moraš da uradiš i validaciju podataka na sloju poslovne logike (ili kako je već zoveš). Možda imaš više formi preko kojih možeš da uradiš unos osoba, ali moraš (trebao bi) imati i "centralno" mesto gde se vrši validacija i koje je nezavisno od prezentacionog sloja. Tu je sasvim u redu da baciš exception jer to predstavlja alarmantno stanje: navodno je korisnik uneo validne podatke ali pre unosa podataka u bazu si ipak proverio da podaci nisu validni.

Kod bacanja grešaka, gledaj da baciš specifičnu grešku, a ne System.Exception, da bi u catch bloku po tipu greške mogao da znaš šta se tačno desilo (podaci nisu validni, pukla je konekcija ka bazi, itd.). Isto važi i za hvatanje grešaka. Na ovom linku možeš pročitati nešto više o tome.

Rešenje koje ti je dao Dušan Kondić u svom prvom postu bi trebao da izbegavaš (no hard feelings :) ) jer za svaku validaciju instancira Exception klasu dva puta, a onda koristi samo Exception.Message. Isti efekat bi se mogao postići i sa sledećim kodom:

Code:
private string validacijaImena(string ime)
{
    return string.IsNullOrWhiteSpace(ime) ? "Morate uneti ime" : string.Empty;
}
...
private void button1_Click(object sender, EventArgs e)
{
    string messageText = validacijaImena("Milan");
    ...
}


Potraži na internetu, verovatno ima dobrih i besplatnih framework-a za klijent i server validaciju. Ja sam pre tri godine za razvoj desktop aplikacija koristio CSLA. Ne znam kako je danas pozicioniran.
[ wex-alpha @ 23.12.2012. 17:20 ] @
try/catch koristi kada si iscrpio sve mogucnosti.
Reicmo imas konverziju iz int32 u string... mozes to rijesiti sa try/catch, ali imas mnogo bolje rjesenje, tako da ti try/catch u tom slucaju i ne treba...


Pogledaj:
Int32.TryParse Method (String, Int32%)