Что произойдет, если я не сгенерирую исключение в блоке try?
Если вы не сгенерируете исключение, и никакое другое исключение не возникает, блок catch
не побежитВместо этого код пропустит блок catch и продолжит выполнение всего, что будет потом (включая блок finally
, если он есть).
представьте, что в блоке try есть код, которыйгенерирует исключение, но блок try не имеет оператора throw.
Блок catch будет по-прежнему выполняться ... тогда и только тогда, когда тип исключения соответствует типу, объявленномуcatch
блок.Давайте посмотрим на несколько примеров.Сначала приведем пример:
try
{
double x = 1 / 0.0;
}
catch (DivideByZeroException ex)
{
Console.WriteLine(ex.Message);
}
В этом случае у нас есть код, вызывающий исключение DivideByZeroException
.Поскольку это соответствует типу, используемому в блоке catch
, будет запущен обработчик исключений.
Далее:
try
{
double x = 1 / 0.0;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
У нас все еще есть исключение DivideByZeroException
... но так какDivideByZeroException
унаследовано от базового типа Exception
, все по-прежнему совместимо, и блок catch будет запущен.
Еще один:
try
{
double x = 1 / 0.0;
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
У нас все еще есть исключение DivideByZeroException
,но на этот раз catch
блок не совместим.В этом случае программа будет аварийно завершать работу из-за необработанного исключения (если только это исключение не обработано где-либо еще в стеке программы).
Еще одно:
try
{
double x = 1 / 0.0;
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Два catch
блоков!Первый блок не будет работать, потому что он не совместим с типом DivideByZeroException
.Тем не менее, второй блок catch
будет работать, потому что он совместим.Исключение обрабатывается, и программа может продолжаться.
Наконец:
double DbyZ(double numerator)
{
try
{
return numerator / 0.0;
}
catch(InvalidOperationException ex)
{
Console.WriteLine("Invalid operation");
}
}
...
try
{
DbyZ(1.0);
}
catch(Exception ex)
{
Console.WriteLine("Exception");
}
На этот раз вывод будет просто "Exception"
.Помните, что вам не всегда нужно отлавливать исключения в том же месте, где они создаются.
Если у вас все еще есть вопросы о том, что может произойти в конкретном случае, создайте свои собственные образцы для тестирования случая исм.