C# klaidas tvarkė per išimtis, kurias surenka try/catch/finally. Tinkamas išimčių tvarkymas reiškia konkrečių išimčių tipų suėmimą, išteklių valymas (dažnai su using), prasmingų pasirinktinių išimčių kūrimą ir klaidų neprarijimą tyliai.
C# klaidas tvarkė per išimtis, kurias surenka try/catch/finally. Tinkamas išimčių tvarkymas reiškia konkrečių išimčių tipų suėmimą, išteklių valymas (dažnai su using), prasmingų pasirinktinių išimčių kūrimą ir klaidų neprarijimą tyliai.
try
{
var data = RiskyOperation();
}
catch (FileNotFoundException ex) // catch SPECIFIC types (most specific first)
{
Console.WriteLine($"File missing: {ex.Message}");
}
catch (IOException ex)
{
Log(ex);
throw; // re-throw, PRESERVING the stack trace (not `throw ex`)
}
catch (Exception ex) // catch-all (last) — base of all exceptions
{
Log(ex);
}
finally
{
Cleanup(); // ALWAYS runs (success, exception, or return)
}
Suimkite konkrečius išimčių tipus pirmiausia, naudokite Exception kaip galutinį sugavimo mechanizmą, o finally valyti išteklius, kurie turi būti valyti visada. Svarbu: naudokite throw; (ne throw ex;) iš naujo metimui — tai išsaugo originalią steną.
if (amount < 0)
throw new ArgumentException("Amount must be positive", nameof(amount));
// a custom exception for your domain
public class InsufficientFundsException : Exception
{
public InsufficientFundsException(string message) : base(message) { }
}
throw new InsufficientFundsException("Balance too low");
// `using` guarantees Dispose() is called (close files/connections) even on exception
using (var file = new StreamReader("data.txt"))
{
var content = file.ReadToEnd();
} // file.Dispose() called automatically here
using var conn = new SqlConnection(...); // C# 8 simplified form
using teiginys užtikrina, kad IDisposable ištekliai (failai, ryšiai) yra tinkamai išlaisvinami — tai pirmenybinis išteklių valymo būdas, patikimesnis nei rankinis finally.
catch (Exception ex) when (ex.Message.Contains("timeout")) // exception filter (when)
{ ... }
✓ Catch SPECIFIC exceptions, not just Exception
✓ Use `using` for IDisposable resources (reliable cleanup)
✓ Don't swallow exceptions silently (empty catch) — log or re-throw
✓ Use `throw;` (not `throw ex;`) to preserve the stack trace
✓ Create meaningful custom exceptions; don't use exceptions for normal control flow
Tinkamas išimčių tvarkymas yra būtinas patvariam, patikimam C# programų kūrimui, todėl jo nuodugniai suprasti yra svarbu.
try/catch/finally struktūra, konkrečių išimčių tipų suėmimas (tiksliniam tvarkymui) su Exception kaip galutine sugavimo alternatyva, ir finally garantuotam valyti yra pagrindiniai.
Nekeli C#-specifinės geriausios praktikos yra ypač svarbios: naudojimas throw; vietoj throw ex; iš naujo metant (subtilus bet labai svarbus detalus — throw ex; iš naujo nustato steną, prarandant vertingą derinimo informaciją), naudojimas using teiginio IDisposable ištekliams (pirmenybinis, patikimas būdas užtikrinti, kad failai, ryšiai ir kiti ištekliai yra tinkamai išlaisvinami net kai atsitinka išimtys — patikimesnis nei rankinis finally blokai, ir centrinis C# išteklių valdymo modelio elementas), ir išimčių neprarijimas tyliai.
Supratimas apie išimčių tvarkymą — struktūrą, konkrečius suėmimus, pasirinktines išimtis, steną išsaugantį iš naujo metimą, ir ypač using išteklių valyti — yra svarbus patikimam C# rašymui, kuris tvarkytų klaidas elegantiškai ir tvaldytų išteklius teisingai.
Nes netvarkytosios išimtys ir išteklių nutekėjimai sukelia tikras patikimumo problemas, o C# turi specifines idiomas (šabloną using, throw; išsaugojimą), kurie skiria tvirtas kodo dalis nuo trapios kodo dalies, išimčių tvarkymo įvaldymas yra svarbi, dažnai taikoma žinia profesionaliam C# kurimas.