- Kompilyasiya xətasını icra zamanı yaranan istisnadan fərqləndirmək
try, bir neçəcatchbloku vəfinallyilə istisnaları tutmaqthrowilə istisna atmaq və öz istisna sinfini yaratmaq- Gözlənilən səhvlər üçün
TryParsekimi yolları seçmək
Kompilyator çox səhvi proqram işə düşməzdən əvvəl tapır, amma hamısını yox. İstifadəçi yaş əvəzinə «abc» yazır, fayl silinib, internet kəsilib, kimsə sıfıra bölür — bu problemlər yalnız proqram işləyərkən üzə çıxır. C#-da belə hallarda istisna (exception) yaranır. Onu tutmasan, proqram «Unhandled exception» mesajı ilə dayanır; tutsan, istifadəçiyə aydın izahat verib işi davam etdirə bilərsən.
try və catch
Xəta verə biləcək kod try blokuna yazılır. İstisna yaranan kimi try-ın qalan sətirləri buraxılır və idarə uyğun catch blokuna keçir. Hər catch müəyyən istisna tipini tutur, ona görə müxtəlif xətalara müxtəlif cür reaksiya vermək olar.
string[] inputs = ["42", "abc", "99999999999"];
foreach (string input in inputs)
{
try
{
int number = int.Parse(input);
Console.WriteLine($"OK: {number}");
}
catch (FormatException)
{
Console.WriteLine($"'{input}' is not a number");
}
catch (OverflowException)
{
Console.WriteLine($"'{input}' is too big for int");
}
}OK: 42 'abc' is not a number '99999999999' is too big for int
İstisna həm də obyektdir: catch (IndexOutOfRangeException ex) yazanda ex dəyişənində onun məlumatları olur, məsələn, ex.Message — izahat mətni. Bütün istisnalar Exception sinfindən törəyir, ona görə catch (Exception ex) istənilən xətanı tutur — onu həmişə sonuncu yaz. finally bloku isə xəta olsa da, olmasa da həmişə icra olunur: faylı bağlamaq və ya resursu azad etmək üçün uyğundur.
int[] scores = [90, 75, 88];
try
{
Console.WriteLine(scores[5]);
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
finally
{
Console.WriteLine("This line always runs.");
}
try
{
int zero = 0;
Console.WriteLine(10 / zero);
}
catch (Exception ex)
{
Console.WriteLine($"{ex.GetType().Name}: {ex.Message}");
}Error: Index was outside the bounds of the array. This line always runs. DivideByZeroException: Attempted to divide by zero.
| İstisna | Nə vaxt yaranır |
|---|---|
FormatException | int.Parse("abc") — mətn ədəd deyil |
DivideByZeroException | tam ədəd sıfıra bölünür |
IndexOutOfRangeException | massivdə olmayan indeks |
KeyNotFoundException | lüğətdə olmayan açar |
NullReferenceException | null olan dəyişənin üzvünə müraciət |
FileNotFoundException | açılmaq istənilən fayl yoxdur |
throw: istisnanı özün atmaq
Metod işini düzgün görə bilmirsə, səssizcə yanlış nəticə qaytarmaq əvəzinə throw ilə istisna atmalıdır. Hazır tiplər çoxdur: ArgumentException — yanlış arqument, InvalidOperationException — obyektin indiki vəziyyətində icazəsiz əməliyyat. Lazım olsa, Exception-dan törəyən öz istisna sinfini yaratmaq olar — bu, keçən dərsdəki varisliyin real tətbiqidir.
var wallet = new Wallet(100);
try
{
wallet.Pay(30);
wallet.Pay(250);
wallet.Pay(10);
}
catch (NotEnoughMoneyException ex)
{
Console.WriteLine($"Payment failed: {ex.Message}");
}
Console.WriteLine($"Left: {wallet.Balance} AZN");
class NotEnoughMoneyException(string message) : Exception(message);
class Wallet(decimal balance)
{
public decimal Balance { get; private set; } = balance;
public void Pay(decimal amount)
{
if (amount > Balance)
throw new NotEnoughMoneyException($"need {amount} AZN, have {Balance} AZN");
Balance -= amount;
Console.WriteLine($"Paid {amount} AZN");
}
}Paid 30 AZN Payment failed: need 250 AZN, have 70 AZN Left: 70 AZN
wallet.Pay(10) heç icra olunmadı: istisnadan sonra try-ın qalanı buraxılır.İstisnaları nə vaxt işlətməməli
İstisnalar gözlənilməz hallar üçündür. İstifadəçinin səhv yazması isə tamamilə gözləniləndir, ona görə mətni yoxlamaq üçün try/catch əvəzinə int.TryParse daha yaxşıdır: kod qısadır, daha sürətli işləyir və niyyəti aydın göstərir. Eyni qayda lüğətlərə də aiddir: TryGetValue açarın olmamasını xətasız yoxlayır.
string[] answers = ["15", "fifteen", "-3"];
foreach (string answer in answers)
{
if (!int.TryParse(answer, out int age))
Console.WriteLine($"'{answer}': please type digits");
else if (age is < 0 or > 120)
Console.WriteLine($"'{answer}': age must be 0-120");
else
Console.WriteLine($"Age accepted: {age}");
}Age accepted: 15 'fifteen': please type digits '-3': age must be 0-120
Əsas fikirlər
- İstisna proqram işləyərkən yaranan xətadır; tutulmasa, proqram dayanır.
tryblokunda istisna yarananda qalan sətirlər buraxılır və uyğuncatchişləyir.- Xüsusi
catchblokları əvvəl,catch (Exception)sonda yazılır;finallyhəmişə icra olunur. throw new ...Exception("...")səhv vəziyyəti bildirir; öz istisnalarınıException-dan törət.- Gözlənilən səhvlər üçün
TryParsevəTryGetValueistisnalardan yaxşıdır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.
int.Parse("abc") hansı istisnanı yaradır?