Virheenkäsittely
Olet saattanut törmätä termiin ajonaikainen virhe aiemmissa luvuissa. Ajonaikainen virhe on virhe, joka tapahtuu ohjelman suorittaessa – 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 yritetään suorittaa koodia ja jos se epäonnistuu, otetaan kiinni ja käsitellään virhe ohjelman kaatumisen sijaan.
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öytynyt (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
Lisäksi on olemassa valinnainen koodilohko nimeltä finally, joka suoritetaan catch-lohkon jälkeen. finally-lohko suoritetaan aina try- ja catch-lohkojen jälkeen, riippumatta siitä, heitettiinkö poikkeus vai ei. Tämä takaa, että kaikki finally-lohkon sisällä oleva koodi suoritetaan joka kerta, mikä tekee siitä hyödyllisen esimerkiksi tiedostojen sulkemiseen tai resurssien vapauttamiseen.
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
What are some other examples of runtime errors?
Can you explain how the try-catch block works with a code example?
What is the difference between compile-time and runtime errors?
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 suorittaessa – 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 yritetään suorittaa koodia ja jos se epäonnistuu, otetaan kiinni ja käsitellään virhe ohjelman kaatumisen sijaan.
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öytynyt (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
Lisäksi on olemassa valinnainen koodilohko nimeltä finally, joka suoritetaan catch-lohkon jälkeen. finally-lohko suoritetaan aina try- ja catch-lohkojen jälkeen, riippumatta siitä, heitettiinkö poikkeus vai ei. Tämä takaa, että kaikki finally-lohkon sisällä oleva koodi suoritetaan joka kerta, mikä tekee siitä hyödyllisen esimerkiksi tiedostojen sulkemiseen tai resurssien vapauttamiseen.
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!