Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 162
- Предыдущая
- 162/642
- Следующая
Внутренние исключения
Как нетрудно догадаться, вполне возможно, что исключение сгенерируется во время обработки другого исключения. Например, пусть вы обрабатываете исключение
CarIsDeadException
catch
carErrors.txt
using
System.IO
catch(CarIsDeadException e)
{
// Попытка открытия файла carErrors.txt, расположенного на диске С:.
FileStream fs = File.Open(@"C:\carErrors.txt", FileMode.Open);
...
}
Если указанный файл на диске С: отсутствует, тогда вызов метода
File.Open()
FileNotFoundException
System.IO
Когда во время обработки исключения вы сталкиваетесь с еще одним исключением, установившаяся практика предусматривает обязательное сохранение нового объекта исключения как "внутреннего исключения" в новом объекте того же типа, что и исходное исключение. Причина, по которой необходимо создавать новый объект обрабатываемого исключения, связана с тем, что единственным способом документирования внутреннего исключения является применение параметра конструктора. Взгляните на следующий код:
using System.IO;
// Обновление обработчика исключений
catch (CarIsDeadException e)
{
try
{
FileStream fs =
File.Open(@"C:\carErrors.txt", FileMode.Open);
...
}
catch (Exception e2)
{
// Следующая строка приведет к ошибке на этапе компиляции,
// т.к. InnerException допускает только чтение.
// е.InnerException = е2;
// Сгенерировать исключение, которое записывает новое
// исключение, а также сообщение из первого исключения.
throw new CarIsDeadException(
e.CauseOfError, e.ErrorTimeStamp, e.Message, e2); }
}
Обратите внимание, что в данном случае конструктору
CarIsDeadException
FileNotFoundException
Поскольку после операторов верхнего уровня нет "следующего вызывающего кода", который мог бы перехватить исключение, пользователю будет отображено системное диалоговое окно с сообщением об ошибке. Подобно повторной генерации исключения запись внутренних исключений обычно полезна, только если вызывающий код способен обработать исключение более элегантно. В таком случае внутри логики
catch
InnerException
Блок finally
В области действия
try/catch
finally
finally
Console.WriteLine("***** Handling Multiple Exceptions *****\n");
Car myCar = new Car("Rusty", 90);
myCar.CrankTunes(true);
try
{
// Логика, связанная с увеличением скорости автомобиля.
}
catch(CarIsDeadException e)
{
// Обработать объект CarIsDeadException.
}
catch(ArgumentOutOfRangeException e)
{
// Обработать объект ArgumentOutOfRangeException.
}
catch(Exception e)
{
// Обработать любой другой объект Exception.
}
finally
{
// Это код будет выполняться всегда независимо
// от того, возникало исключение или нет.
myCar.CrankTunes(false);
}
Console.ReadLine();
Если вы не определите блок
finally
finally
Фильтры исключений
В версии C# 6 появилась новая конструкция, которая может быть помещена в блок
catch
when
catch
true
false
when
- Предыдущая
- 162/642
- Следующая