» »

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

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

japol ::

Imam try/catch stavek.
public void Izr()
        {
            try
            {
// koda...
                fckk = System.Double.Parse(textBox1.Text, System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
// koda...
      for (int štV = 0; štV < (dataGridView1.Rows.Count - 1); štV++)
                {
                    a = double.Parse(dataGridView1.Rows[štV].Cells["Column2"].Value.ToString(), System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
                    b = double.Parse(dataGridView1.Rows[štV].Cells["Column3"].Value.ToString(), System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
                    v = double.Parse(dataGridView1.Rows[štV].Cells["Column4"].Value.ToString(), System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
}
// koda...
}
catch(FormatException e) // če je vpis črka,...
{

}
  catch (NullReferenceException e) // če sploh ni bilo vpisa
{

}

}


Potrebujem nekakšen MessageBox v katerem piše ali je bila napaka narejena v textBox1 ali v dataGridView1, s tem bi uporabnik takoj vedel kje naj išče napako in jo popravi.
A bi lahko pisal nekako tako?:
catch(FormatException e) // če je vpis črka,...
{
if (textBox1... == e)
{
MessageBox.Show ("Napačen vpis fckk.");
}
if (dataGridView1... == e)
{
MessageBox.Show ("Napačen vpis v tabelo.");
}
}

darkkk ::

1. način: namesto parse uporabi tryparse in z rezultatom tryparsa kontroliraš "flow"
2. način: več try catch blokov
3. kombinacija zgornjih dveh:

try{
int fkkk;
bool ok = Int32.TryParse(tvojniz, out fkk, rest of crap)
if(!ok) throw new Exception("Napaka pri vnosu fkkk");

...
}
catch(Exception ex){
if(ex.msg == "napaka pri vnosu fkkk") MessageBox.Show....
}

Načeloma je sicer fajn, da malo bolj popedeniš exceptione, ki jih mečeš...

Zgodovina sprememb…

  • spremenil: darkkk ()

Red_Mamba ::

poglej kaj ti e.Source vrne.
spremenljivka e direktno ne vem ce bo sla
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

japol ::

Saj sedaj razmišljam če pri vsaki spremnljivki vstavim svoj try/catch.

Če prikažem primer na zgornji kodi:
public void Izr()
        {
try
            {
fckk = System.Double.Parse(textBox1.Text, System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
}
catch(FormatException e) // če je vpis črka,...
{
 MessageBox.Show ("Napačen vpis fckk.");
}
  catch (NullReferenceException e) // če sploh ni bilo vpisa
{
 MessageBox.Show ("Napačen vpis fckk.");
}
 
}

in spet za drugo spremenljivko:
public void Izr()
        {
try
            {
for (int štV = 0; štV < (dataGridView1.Rows.Count - 1); štV++)
                {
                    a = double.Parse(dataGridView1.Rows[štV].Cells["Column2"].Value.ToString(), System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
                    b = double.Parse(dataGridView1.Rows[štV].Cells["Column3"].Value.ToString(), System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
                    v = double.Parse(dataGridView1.Rows[štV].Cells["Column4"].Value.ToString(), System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);
}
}
catch(FormatException e) // če je vpis črka,...
{
 MessageBox.Show ("Napačen vpis v tabelo.");
}
  catch (NullReferenceException e) // če sploh ni bilo vpisa
{
 MessageBox.Show ("Napačen vpis v tabelo.");
}
 
}

Ampak temu sem se želel izogniti, ker je veliko več tega kot sem tu v primeru prikazal. Bo veliko try/catch statmentov.

p.s. Saj bo druga spremenljivka, primer: (FormatException Napaka)

Zgodovina sprememb…

  • spremenil: japol ()

KrEn1234 ::

Kot je že darkkk napisal:

try-Catch block je mišljen za izjemne dogodke(npr. če pade mrežna povezava,...). Exception je iz stališča resursev zelo draga zadeva. V tvojem primeru bi jaz raje uporabil tryparse in nato gradil novi ApplicationException.

Red_Mamba ::

Jaz vcasih naredim tudi tako da v zacetku definiram spremenljivko:

int vrstica = 0;

potem pa prev vsako vrstico nafilam vrstica++;

k se exception zgodi pogledam vrednost spremenljivke vrstica in vem kje se usuje.
Veliko lazje kot malo morje try/catch-ov
[st.slika https://img.shields.io/badge/Slo-Tech-green.svg test]
Linkedin >> http://goo.gl/839Aua
Mamba's Crypto & ICO's: https://t.me/joinchat/AAAAAExTkO4P4UDy0fIZdg

darkkk ::

Za to maš catch(Exception ex){ex.StackTrace}

Looooooka ::

kar se tice .parse in .tryparse ti zgoraj napisanih parametrov ni treba pisat, ker so ze privzeti (System.Globalization.NumberFormatInfo.CurrentInfo...in tist System.Globalization.NumberStyles.Number je verjetno tudi odvec).
in zakaj bi lovil nullreference exceptione?...to pomeni, da program dela nekaj kar nisi predvidel. preden uporabit tiste celle- jih daj v eno lokalno sprejemljivko in preveri, da niso null.
Ce seveda slucajno NE dovolis null vnosov

Pa btw...gridu lahko za vsak column nastavis kaksno obliko vnosa zahtevas (string,datetime, format stevilke...) in sploh ne bos rabil preverjat v funkciji, ker bo ze grid poskrbel za to, da ti uporabnik ne vnasa dreka.

Zgodovina sprememb…

  • spremenilo: Looooooka ()

japol ::

Glede System.Globalization.NumberFormatInfo.CurrentInfo itd... :
Testiral sem program pri kolegih, profesorju,... in dobil napačen izračun. To pa zato, ker imajo inštalirane wolframalpha, mathematico,... in tako imajo decimalno ločilo piko ne pa vejico. S tem sem želel rešiti to da program deluje z nastavitvami kot so v windowsih. Če ima nastavljeno piko, potem da vnaša piko, če pa vejico, pa vejico.
Na to temo je že bila ustvarjena tema:
[c#] textbox, vpis samo cifer, event _TextChanged, pika/vejica

Imam metodo z okoli 800 vrsticami kode. to se nahaja znotraj try, v catch sem pa želel le to da če je prišlo do napake v nekem textboxu, da prikaže messagebox. Da točno veš kje se je pojavila napaka. Saj če ne bo šlo drugače bom pisal try/catch znotraj metode, jih bo pa kar nekaj in temu sem se želel izogniti.

darkkk ::

Moje mnenje, znotraj "večjih" metod se ne piše try/catch-ov (razen, če imaš opravka z nekimi nestabilnimi stvarmi, kot npr. branje/pisanje datotek), ampak mečeš ven exceptione, katere pohendlaš zunaj.

try{
    mojaGolomaznaMetoda(...);
}
catch (){}
catch(){}
...

japol ::

Ok, pa na tak način. Sedaj mi podaj še primer kode npr. enega MessageBoxa znotraj catch, če se je pojavila napaka v spremenljivki "a" (recimo da "a" pripada textBox1), ki je znotraj metode mojaGolomaznaMetoda.


Vredno ogleda ...

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

[VB] datagridview

Oddelek: Programiranje
351936 (1319) korenje3
»

C# INSERT statment ne vpise podatkov

Oddelek: Programiranje
111203 (1077) darkolord
»

c# regularni izraz

Oddelek: Programiranje
202015 (1713) darkolord
»

[C#] Ne prkaže takoj podatkov

Oddelek: Programiranje
81132 (995) darkolord
»

[C#] DATA GRID VIEW

Oddelek: Programiranje
131941 (1821) Kekec

Več podobnih tem