Virheenkäsittely
Olet saattanut törmätä termiin ajonaikainen virhe aiemmissa luvuissa. Ajonaikainen virhe on virhe, joka tapahtuu ohjelman suoritushetkellä – tästä nimi "ajonaikainen" virhe.
Yleensä kun ajonaikainen virhe tapahtuu, ohjelma kaatuu tai lakkaa vastaamasta.
Kääntäjä voi auttaa osoittamalla suurimman osan virheistä koodissamme, mutta ajonaikaiset virheet ovat enimmäkseen arvaamattomia ja riippuvat usein epävarmoista parametreista.
Esimerkiksi, jos StreamReader
-luokalle annettu tiedostopolku on virheellinen tai sitä ei ole olemassa, syntyy ajonaikainen virhe ja ohjelma kaatuu. Tämän vuoksi tällainen riskialtis koodi voidaan usein sijoittaa try-catch
-lohkoihin, jolloin yritämme suorittaa koodia ja jos se epäonnistuu, sieppaamme ja käsittelemme virheen sen sijaan, että ohjelma kaatuisi.
Seuraavassa on try-catch
-lohkon syntaksi:
index.cs
1234567try { // code to try } catch (Exception errorVar) { // code to handle error }
Tässä Exception
on avainsana, joka edustaa Exception-tietotyyppiä.
Esimerkki
index.cs
1234567891011121314151617using System; using System.IO; class Program { static void Main(string[] args) { try { new StreamWriter("C:/a/random/path/that/does/not/exist.txt"); } catch(Exception error) { Console.WriteLine(error.Message); } } }
Voimme jättää pois (Exception error)
-osan catch
-lauseesta, jos emme käytä error
-muuttujaa.
Seuraavassa on joitakin yleisiä tilanteita, joissa ajonaikainen virhe voi esiintyä:
Nollalla jakaminen
index.cs
123456789101112131415161718using System; class Program { static void Main(string[] args) { try { int a = 100; int b = 0; int result = a / b; } catch { Console.WriteLine("ERROR: Division by Zero."); } } }
Taulukon tai listan virheellinen indeksi
index.cs
1234567891011121314151617using System; class Program { static void Main(string[] args) { try { var exampleArray = new int[10]; Console.WriteLine(exampleArray[20]); } catch { Console.WriteLine("ERROR: The array index is out of bounds."); } } }
Avain ei löydy (sanakirjoille):
index.cs
123456789101112131415161718192021using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } } }
finally-lohko
On olemassa myös valinnainen koodilohko nimeltä finally
, joka suoritetaan catch
-lohkon jälkeen:
index.cs
12345678910111213141516171819202122232425using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } finally { Console.WriteLine("This line will show after the error"); } } }
1. Mikä on seuraavan ohjelman tuloste?
2. Mikä on finally
-lohkon tarkoitus C#:ssa?
3. Mikä seuraavista väittämistä pitää paikkansa koskien try-catch
-lohkoa C#:ssa?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 2.04
Virheenkäsittely
Pyyhkäise näyttääksesi valikon
Olet saattanut törmätä termiin ajonaikainen virhe aiemmissa luvuissa. Ajonaikainen virhe on virhe, joka tapahtuu ohjelman suoritushetkellä – tästä nimi "ajonaikainen" virhe.
Yleensä kun ajonaikainen virhe tapahtuu, ohjelma kaatuu tai lakkaa vastaamasta.
Kääntäjä voi auttaa osoittamalla suurimman osan virheistä koodissamme, mutta ajonaikaiset virheet ovat enimmäkseen arvaamattomia ja riippuvat usein epävarmoista parametreista.
Esimerkiksi, jos StreamReader
-luokalle annettu tiedostopolku on virheellinen tai sitä ei ole olemassa, syntyy ajonaikainen virhe ja ohjelma kaatuu. Tämän vuoksi tällainen riskialtis koodi voidaan usein sijoittaa try-catch
-lohkoihin, jolloin yritämme suorittaa koodia ja jos se epäonnistuu, sieppaamme ja käsittelemme virheen sen sijaan, että ohjelma kaatuisi.
Seuraavassa on try-catch
-lohkon syntaksi:
index.cs
1234567try { // code to try } catch (Exception errorVar) { // code to handle error }
Tässä Exception
on avainsana, joka edustaa Exception-tietotyyppiä.
Esimerkki
index.cs
1234567891011121314151617using System; using System.IO; class Program { static void Main(string[] args) { try { new StreamWriter("C:/a/random/path/that/does/not/exist.txt"); } catch(Exception error) { Console.WriteLine(error.Message); } } }
Voimme jättää pois (Exception error)
-osan catch
-lauseesta, jos emme käytä error
-muuttujaa.
Seuraavassa on joitakin yleisiä tilanteita, joissa ajonaikainen virhe voi esiintyä:
Nollalla jakaminen
index.cs
123456789101112131415161718using System; class Program { static void Main(string[] args) { try { int a = 100; int b = 0; int result = a / b; } catch { Console.WriteLine("ERROR: Division by Zero."); } } }
Taulukon tai listan virheellinen indeksi
index.cs
1234567891011121314151617using System; class Program { static void Main(string[] args) { try { var exampleArray = new int[10]; Console.WriteLine(exampleArray[20]); } catch { Console.WriteLine("ERROR: The array index is out of bounds."); } } }
Avain ei löydy (sanakirjoille):
index.cs
123456789101112131415161718192021using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } } }
finally-lohko
On olemassa myös valinnainen koodilohko nimeltä finally
, joka suoritetaan catch
-lohkon jälkeen:
index.cs
12345678910111213141516171819202122232425using System; using System.Collections.Generic; class Program { static void Main(string[] args) { try { Dictionary<string, string> myDict = new Dictionary<string, string> { { "key1", "value1" } }; Console.WriteLine(myDict["key2"]); } catch { Console.WriteLine("Error: Key not found"); } finally { Console.WriteLine("This line will show after the error"); } } }
1. Mikä on seuraavan ohjelman tuloste?
2. Mikä on finally
-lohkon tarkoitus C#:ssa?
3. Mikä seuraavista väittämistä pitää paikkansa koskien try-catch
-lohkoa C#:ssa?
Kiitos palautteestasi!