Несколько блоков catch в C#
В одном try может произойти сбой разного
типа. Решение - несколько блоков catch
подряд. Среда выбирает первый блок, тип
которого подходит:
try {
// code that may fail
} catch (FormatException) {
// bad text
} catch (DivideByZeroException) {
// zero divisor
}
Пусть нужно разобрать две строки как числа и поделить первое на второе. Ошибка формата и деление на ноль обрабатываются разными сообщениями:
void DivideStrings(string left, string right) {
try {
int x = int.Parse(left);
int y = int.Parse(right);
Console.WriteLine(x / y);
} catch (FormatException) {
Console.WriteLine("not a number");
} catch (DivideByZeroException) {
Console.WriteLine("division by zero");
}
}
DivideStrings("10", "0");
DivideStrings("10", "two");
Более конкретный catch ставят выше общего.
Сначала перечисляют узкие типы, которые
нужны в задаче:
Dictionary<string, int> dct = new() { ["a"] = 1, ["b"] = 2 };
string keyText = "x";
try {
int n = int.Parse(keyText);
Console.WriteLine(dct["k" + n]);
} catch (FormatException) {
Console.WriteLine("bad key text");
} catch (KeyNotFoundException) {
Console.WriteLine("bad key");
}
Даны строки left и right.
В try преобразуйте обе через int.Parse
и выведите частное. Для FormatException
выведите "parse", для DivideByZeroException
выведите "zero".
string left = "12";
string right = "0";