Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Virheenkäsittely | Tietorakenteet ja Tiedostojen Käsittely
C# Perusteiden Jälkeen

bookVirheenkä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

index.cs

copy
1234567
try { // code to try } catch (Exception errorVar) { // code to handle error }

Tässä Exception on avainsana, joka edustaa Exception-tietotyyppiä.

Esimerkki

index.cs

index.cs

copy
1234567891011121314151617
using 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); } } }
Note
Huomio

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

index.cs

copy
123456789101112131415161718
using 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

index.cs

copy
1234567891011121314151617
using 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

index.cs

copy
123456789101112131415161718192021
using 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

index.cs

copy
12345678910111213141516171819202122232425
using 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?

question mark

Mikä on seuraavan ohjelman tuloste?

Select the correct answer

question mark

Mikä on finally-lohkon tarkoitus C#:ssa?

Select the correct answer

question mark

Mikä seuraavista väittämistä pitää paikkansa koskien try-catch-lohkoa C#:ssa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 9

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 2.04

bookVirheenkä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

index.cs

copy
1234567
try { // code to try } catch (Exception errorVar) { // code to handle error }

Tässä Exception on avainsana, joka edustaa Exception-tietotyyppiä.

Esimerkki

index.cs

index.cs

copy
1234567891011121314151617
using 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); } } }
Note
Huomio

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

index.cs

copy
123456789101112131415161718
using 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

index.cs

copy
1234567891011121314151617
using 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

index.cs

copy
123456789101112131415161718192021
using 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

index.cs

copy
12345678910111213141516171819202122232425
using 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?

question mark

Mikä on seuraavan ohjelman tuloste?

Select the correct answer

question mark

Mikä on finally-lohkon tarkoitus C#:ssa?

Select the correct answer

question mark

Mikä seuraavista väittämistä pitää paikkansa koskien try-catch-lohkoa C#:ssa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 9
some-alt