om man har en kod som denna:
while(myReader.Read())
{
try
{
blabla
}
catch(System.Web.HttpException ehttp)
{
blabla
}
}
säg att whilesatsen loopar 10 poster ur en databas
och så får man ett undantagsfel efter 5 poster, körs hela whilesatsen ändå eller stoppas körningen när undantaget uppstår?
har också en följdfråga:
kodexempel:
while(myReader.Read())
{
try
{
SmtpMail.SmtpServer = "mailserver";
SmtpMail.Send(mm);
p.DeleteMessages(MsgId);
}
catch(System.Web.HttpException ehttp)
{
blabla
}
}
om SmtpMail.Send(mm); skulle misslyckas, kommer p.DeleteMessages(MsgId); att köras ändå eller hoppar koden direkt till catch?
Engine^Medlem sedan dec. 20003 887 inlägg Det kan väl gå att testa med t.ex.
while(i < 10)
{
try
{
Console.WriteLine((i / (i++ - 5)).ToString());
}
catch(System.DivideByZeroException e)
{
Console.WriteLine("ooops!");
}
}
Om nu try-delen fungerar....
GladhMedlem sedan maj 20012 812 inlägg
säg att whilesatsen loopar 10 poster ur en databas
och så får man ett undantagsfel efter 5 poster, körs hela whilesatsen ändå eller stoppas körningen när undantaget uppstår?
Eftersom du har en try-catch sats så har du berättat för kompilatorn att du kommer att ta hand om eventuella fel som du fångar, det betyder att din blablabla-kod kommer att exekveras vid ett fel och sedan så kommer while-loopen att fortsätta. Det beror givetviss på vad du gör i din kod, gör du en throw så kommer felet att kastas vidare och du kommer att avsluta din while sats, likaså om du gör en break eller en return i ditt catch-block.
om SmtpMail.Send(mm); skulle misslyckas, kommer p.DeleteMessages(MsgId); att köras ändå eller hoppar koden direkt till catch?
Nej den kommer inte att köras vid ett fel, allting som händer efter den raden där felet uppstod kommer inte att köras. Därför är det viktigt att man vet vad man sysslar med, ett vanligt fel är att man öppnar en databas och sedan gör kommand och sedan stänger man den i en try-catch-block, tyvärr så kommer stängningen inte att genomföras om ett fel uppstår i kommandot. Då finns det flera olika sätt att lösa det på. Man lägger samma kod i sitt catch-block, så vet man att det kommer att köras även om det blir ett fel. Ett annat bättre alternativ är att använda finally blocket och lägga koden där, eftersom MS garanterar att all kod i finally kommer att köras även om ett fel uppstår.
Ett tredje alternativ som man kan använda ibland är using där garanterar MS att om du öppnar en databas med using så kommer databasen stängas även om det uppstår fel i din kod, du behöver heller inte explicit stänga den eftersom detta sker så fort man kommit ur using-blocket.
- M