Archive

Posts Tagged ‘Erand’

Eranditöötlus rööpsilmuses

Mis saab, kui ühes rööpsilmuse lõimes tekkib erand? Teised silmused lõpetavad töö samamoodi nagu Stop()-meetodi puhul. Erandi poolt tekitatud katkestus on suurema prioriteediga kui Stop() ja Break(), aga siiski lubatakse kõigil lõimedel oma käsilolev tsükkel lõpule viia.

Klassil ParallelLoopState on selline asi nagu IsExceptional, mida pikalt töötavad tsüklid saavad aeg-ajalt kontrollida, et siis kiiremini pillid kotti panna. Alltoodud näites ei ole state.IsExceptional kunagi tõene, sest seda küsitakse tsükli alguses ja uut tsüklit ei alustata kunagi, kui mingi tsükkel on erandi tekitanud. Aga pikema tsükli keskel on küsimusel jumet.

static void Main(string[] args)
{
try
{
Parallel.For(0, 20, (i, state) =>
{
if (state.IsExceptional)
Console.WriteLine("Ups!");
else
{
Console.WriteLine(i);
if (i == 3)
throw new Exception("Ämber");
}
});
}
catch (Exception x)
{
Console.WriteLine(x.Message);
}
}

Kui sa selle koodi käivitad, võid näha, et pärast vea genereerimist lõpetavad tsüklid töö, kus keegi parasjagu on. Silmus ise tekitab erandi “One or more errors occurred” ja rohkem infot sisaldab InnerException.