NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Using místo try a finally

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jirka
Člen
Avatar
Jirka:8.6.2017 15:58

Ahoj, neskutečně se trápím s tím, že mi visual studio neustále odmítá použití výrazu using místo try a finally

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString))
            {
                if (db.State == ConnectionState.Closed)
                    db.Open();
.
.
.
}

v error listu se zobrazuje akorát chyba CS1003 - syntax error, 'try' expected
začínám propadat šílenství

 
Odpovědět
8.6.2017 15:58
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Jirka
Ondřej Štorc:8.6.2017 19:09

Nemáš za tím ještě nějaký catch nebo finally blok?

Nahoru Odpovědět
8.6.2017 19:09
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Jirka
vajkuba1234:9.6.2017 0:46

Posli celou metodu.

Nahoru Odpovědět
9.6.2017 0:46
No hope, no future, JUST WAR!
Avatar
Jirka
Člen
Avatar
Odpovídá na Ondřej Štorc
Jirka:9.6.2017 8:00

ano, za using jsem měl catch pro odchycení vyjímky po odstranění již bez problému, ale jak tedy odchytit vyjímku?

 
Nahoru Odpovědět
9.6.2017 8:00
Avatar
Odpovídá na Jirka
Michal Štěpánek:9.6.2017 8:06

Using nenahrazuje Try-catch. Pro odchycení vyjímky slouží právě Try-catch blok. Bez toho bys musel použít mnoho různých podmínek
Using slouží k "automatickému ukončení" nějakého bloku kódu, třeba při otevření spojení k db, nebo při otvírání různých souborů...

Editováno 9.6.2017 8:07
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.6.2017 8:06
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jirka
Člen
Avatar
Odpovídá na Michal Štěpánek
Jirka:9.6.2017 8:13

já už jsem si našel alternativu, zabalit using do try,

try
{
    using(SqlConnection conn = new SqlConnection(connString))
    {
      //some code
    }
}
catch (Exception exc)
{
    //handle error
}

nebo obráceně try a catch do using

using(SqlConnection conn = new SqlConnection(connString))
{
    try
    {
        //some code
    }
    catch (Exception exc)
    {
        //handle error
    }
}
 
Nahoru Odpovědět
9.6.2017 8:13
Avatar
Odpovídá na Jirka
Michal Štěpánek:9.6.2017 8:23

S tou druhou alternativou si nejsem jistý. Co se stane, když vyběhne vyjímka? Ukončí se běh funkce a vyskočí z toho bloku, který (podle mě) zůstane neuzavřený, protože nedoběhne do konce.

Nahoru Odpovědět
9.6.2017 8:23
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Luboš Běhounek Satik:9.6.2017 11:18

using je prave syntakticky cukr pro jednoduche try..catch..finally bloky, ktery se akorat navic postara o zavolani dispose() tech IDisposable objektu vytvorenych pres using.

Pokud bys chtel jen v pripade vyjimky zavrit spojeni s DB, pak staci using, pokud to chces treba i zalogovat, pak si musis napsat vlastni try..catch blok a nezapomenout to uvolnit v finally.

viz treba https://msdn.microsoft.com/…vs.100).aspx

Editováno 9.6.2017 11:19
Nahoru Odpovědět
9.6.2017 11:18
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:9.6.2017 12:56

Neodvážím se tvrdit, že to je univerzálně správně, ale já používám pro takovéto případy celý try-catch-finally blok:

SqlConnection conn = new SqlConnection(connString)
try
{
    //do stuff
}
catch (Exception e)
{
    //handle error
}
finally
{
    conn.Dispose();
}

To zajistí, že conn vždy uvolní prostředky a dá se i spolehlivě odchytit vyjímka.

Editováno 9.6.2017 12:56
Nahoru Odpovědět
9.6.2017 12:56
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jirka
Petr Čech:9.6.2017 12:58

try-catch uvnitř using ti neodchytí vyjímku, pokud nastane při vytváření instance conn. To by přitom mělo být ošetřené, protože nevíš, jestli půjde spojení vytvořit. Samozřejmě se to dá vnořit do dalšího bloku, ale to už vzniká docela obludnost.
(ale spojení se uzavře)

Editováno 9.6.2017 12:59
Nahoru Odpovědět
9.6.2017 12:58
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:10.6.2017 12:45

Správně by to mělo být spíše takhle :)

SqlConnection conn = null;
try
{¨
    conn = new SqlConnection(connString);
    //do stuff
}
catch (Exception e)
{
    //handle error
}
finally
{
    conn?.Dispose();
}
 
Nahoru Odpovědět
10.6.2017 12:45
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.