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

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öytynyt (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

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

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

Suggested prompts:

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

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

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öytynyt (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

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

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