Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Внутренние исключения
Как нетрудно догадаться, вполне возможно, что исключение сгенерируется во время обработки другого исключения. Например, пусть вы обрабатываете исключение
CarIsDeadExceptioncatchcarErrors.txtusingSystem.IOcatch(CarIsDeadException e){ // Попытка открытия файла carErrors.txt, расположенного на диске С:. FileStream fs = File.Open(@"C:carErrors.txt", FileMode.Open); ...}Если указанный файл на диске С: отсутствует, тогда вызов метода
File.Open()FileNotFoundExceptionSystem.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); }}Обратите внимание, что в данном случае конструктору
CarIsDeadExceptionFileNotFoundExceptionПоскольку после операторов верхнего уровня нет "следующего вызывающего кода", который мог бы перехватить исключение, пользователю будет отображено системное диалоговое окно с сообщением об ошибке. Подобно повторной генерации исключения запись внутренних исключений обычно полезна, только если вызывающий код способен обработать исключение более элегантно. В таком случае внутри логики
catchInnerExceptionБлок finally
В области действия
try/catchfinallyfinallyConsole.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();Если вы не определите блок
finallyfinallyФильтры исключений
В версии C# 6 появилась новая конструкция, которая может быть помещена в блок
catchwhencatchtruefalsewhenПохожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.