Diskuze: C# vyhození výjimky

C# .NET .NET (C# a Visual Basic) C# vyhození výjimky American English version English version

Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

Ahoj,
mám v C# třídu, ve které zjišťuju číslo z App.config. Problém je v tom, že když se pokusím naparsovat něco ve stylu "sdgaretg", tak místo aby to spadlo s chybou, kód pokračuje dál(chyba se uloží do onoho intu), chyba nastane, až když s tim intem chci pracovat.
Vypadá to nějak takto:

class AppConfiguration {
    public string ComPort { get { return System.Configuration.ConfigurationManager.AppSettings["comport"]; } }
    public string Station { get { return Environment.MachineName; } }
    public string ConnectionString { get { return System.Configuration.ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; } }

    //tohle parsování:
    public int TimeoutMins { get { return int.Parse(System.Configuration.ConfigurationManager.AppSettings["timeoutmins"]); } }
}

pak někde v kódu zavolam

AppConfiguration appConfiguration = new AppConfiguration();

což proběhne bez problémů, chybu to vyhodí např. u

if (timeoutTime >= appConfiguration.TimeoutMins)

Jak zařídit, aby to vyhodilo chybu hned při té inicializaci?
Dík

Odpovědět 26.3.2015 17:46
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:

Jestli to jsou statické data, tak si je ulož a pak je jen zvenčí používej.

Jestli to jsou dynamické data, tak asi nejlehčí způsob je projet to reflexí a dotázat se na ně, ale to je takové řešení nakopačku :D

 
Nahoru Odpovědět  +1 26.3.2015 17:51
Avatar
Odpovídá na Adam Ježek
sadlomaslox25:

ted tam mas neco jako lazy loading bez cachovani. predel si to na eager loading s cachovanim, tj. udelej ve tride konstruktor, data z appconfigu vytahej v konstruktoru do privatnich promenych a ty zpristupni navenek pomoci get property.

 
Nahoru Odpovědět  +1 26.3.2015 20:26
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

diky za snahu, ale naprosto vam oboum rozumim :D neslo by to nejak... min slozite, popripadne s odkazem na msdn? :D

Nahoru Odpovědět 26.3.2015 20:31
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:
public string ComPort { get { return System.Configuration.ConfigurationManager.AppSettings["comport"]; } }

=>

private string comPort;
public string ComPort { get { return comPort; } }
  • v ctoru uděláš
comPort = System.Configuration.ConfigurationManager.AppSettings["comport"];

Ale říkám, jestli se ty data nějakým způsobem dynamicky mění, tak to projdi reflexí (dynamicky se zkusíš zeptat na všechny vlastnosti a můžeš si to tak nechat).

nějak takto:

foreach (var property in this.GetType().GetProperties(System.Reflection.BindingFlags.GetField))
{
    object a = property.GetValue(this);
}
Editováno 26.3.2015 20:39
 
Nahoru Odpovědět 26.3.2015 20:38
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
Adam Ježek:

asi sme si nerozuměli, já řešim to parsování na int, kde to nechce vyhodit vyjímku

Nahoru Odpovědět 26.3.2015 20:41
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Adam Ježek
Jan Vargovský:

To že se na to odkážeš ti tu vyjímku vyhodí...

 
Nahoru Odpovědět 26.3.2015 20:46
Avatar
Andrej Farkaš:

Nebolo by lepšie používať naozajstné settings daného assembly, ako <add key="" value=""> v configu? Tiež to budeš mať v configu + tam budeš mať typ danej hodnoty (bool, int atď..), ak sa nemýlim.
Ak si dobre pamätám, môžeš tam mať default hodnotu, ale to sa dá vyriešiť aj v tvojom riešení cez TryParse.

Nahoru Odpovědět 31.3.2015 15:20
Live. Love. Learn.
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 8 zpráv z 8.