Учебники

WPF — обработка исключений

Исключением является любое состояние ошибки или непредвиденное поведение, возникающее во время выполнения программы. Исключения могут быть вызваны по многим причинам, некоторые из них следующие:

  • Ошибка в вашем коде или в коде, который вы вызываете (например, в общей библиотеке),

  • Недоступные ресурсы операционной системы,

  • Неожиданные условия, с которыми сталкивается общеязыковая среда выполнения (например, код, который невозможно проверить)

Ошибка в вашем коде или в коде, который вы вызываете (например, в общей библиотеке),

Недоступные ресурсы операционной системы,

Неожиданные условия, с которыми сталкивается общеязыковая среда выполнения (например, код, который невозможно проверить)

Синтаксис

Исключения имеют возможность переносить поток программы из одной части в другую. В .NET Framework обработка исключений имеет следующие четыре ключевых слова:

  • try — в этом блоке программа идентифицирует определенное условие, которое вызывает некоторое исключение.

  • catch — ключевое слово catch указывает на перехват исключения. За блоком try следует один или несколько блоков catch, чтобы перехватить исключение с помощью обработчика исключений в том месте программы, где вы хотите решить проблему.

  • finally — блок finally используется для выполнения заданного набора операторов независимо от того, было ли выброшено исключение или нет. Например, если вы открываете файл, он должен быть закрыт независимо от того, возбуждено ли исключение или нет.

  • throw — программа выдает исключение при обнаружении проблемы. Это делается с помощью ключевого слова throw.

try — в этом блоке программа идентифицирует определенное условие, которое вызывает некоторое исключение.

catch — ключевое слово catch указывает на перехват исключения. За блоком try следует один или несколько блоков catch, чтобы перехватить исключение с помощью обработчика исключений в том месте программы, где вы хотите решить проблему.

finally — блок finally используется для выполнения заданного набора операторов независимо от того, было ли выброшено исключение или нет. Например, если вы открываете файл, он должен быть закрыт независимо от того, возбуждено ли исключение или нет.

throw — программа выдает исключение при обнаружении проблемы. Это делается с помощью ключевого слова throw.

Синтаксис для использования этих четырех ключевых слов выглядит следующим образом:

try { 
   ///This will still trigger the exception 
} 
catch (ExceptionClassName e) { 
   // error handling code 
} 
catch (ExceptionClassName e) { 
   // error handling code
}
catch (ExceptionClassName e) { 
   // error handling code 
} 
finally { 
   // statements to be executed 
}

Несколько операторов catch используются в тех случаях, когда блок try может вызвать более одного исключения в зависимости от ситуации потока программы.

иерархия

Почти все классы исключений в .NET Framework прямо или косвенно являются производными от класса Exception. Наиболее важные классы исключений, полученные из класса Exception, —

  • Класс ApplicationException — он поддерживает исключения, которые генерируются программами. Когда разработчик хочет определить исключение, класс должен быть производным от этого класса.

  • Класс SystemException — это базовый класс для всех предопределенных системных исключений времени выполнения. В следующей иерархии показаны стандартные исключения, предоставляемые средой выполнения.

Класс ApplicationException — он поддерживает исключения, которые генерируются программами. Когда разработчик хочет определить исключение, класс должен быть производным от этого класса.

Класс SystemException — это базовый класс для всех предопределенных системных исключений времени выполнения. В следующей иерархии показаны стандартные исключения, предоставляемые средой выполнения.

иерархия

В следующей таблице перечислены стандартные исключения, предоставляемые средой выполнения, и условия, при которых вы должны создать производный класс.

Тип исключения Базовый тип Описание
исключение объект Базовый класс для всех исключений.
SystemException исключение Базовый класс для всех ошибок во время выполнения.
IndexOutOfRangeException SystemException Бросается средой выполнения только тогда, когда массив проиндексирован неправильно.
NullReferenceException SystemException Брошенный средой выполнения только когда ссылка на нулевой объект.
AccessViolationException SystemException Выбрасывается средой выполнения только при обращении к недействительной памяти.
InvalidOperationException SystemException Брошенный методами, когда в недопустимом состоянии.
ArgumentException SystemException Базовый класс для всех исключений аргументов.
ArgumentNullException ArgumentException Вызывается методами, которые не позволяют аргументу быть нулевым.
ArgumentOutOfRangeException ArgumentException Вызывается методами, которые проверяют, что аргументы находятся в заданном диапазоне.
Внешнее исключение SystemException Базовый класс для исключений, которые возникают или нацелены на среды вне среды выполнения.
SEHException Внешнее исключение Исключение, инкапсулирующее Win32 структурированную информацию обработки исключений.

пример

Давайте рассмотрим простой пример, чтобы лучше понять концепцию. Начните с создания нового проекта WPF с именем WPFExceptionHandling .

Перетащите одно текстовое поле с панели инструментов в окно дизайна. Следующий код XAML создает текстовое поле и инициализирует его с некоторыми свойствами.

<Window x:Class = "WPFExceptionHandling.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   xmlns:local = "clr-namespace:WPFExceptionHandling"
   mc:Ignorable = "d" 
   Title = "MainWindow" Height = "350" Width = "604">
	
   <Grid> 
      <TextBox x:Name = "textBox" HorizontalAlignment = "Left"
         Height = "241" Margin = "70,39,0,0" TextWrapping = "Wrap" 
         VerticalAlignment = "Top" Width = "453"/> 
   </Grid> 
	
</Window>

Вот чтение файла с обработкой исключений в C #.

using System; 
using System.IO; 
using System.Windows;

namespace WPFExceptionHandling { 

   public partial class MainWindow : Window { 
	
      public MainWindow() { 
         InitializeComponent(); 
         ReadFile(0); 
      }
		
      void ReadFile(int index) { 
         string path = @"D:\Test.txt"; 
         StreamReader file = new StreamReader(path); 
         char[] buffer = new char[80]; 
			
         try { 
            file.ReadBlock(buffer, index, buffer.Length); 
            string str = new string(buffer); 
            str.Trim(); 
            textBox.Text = str; 
         }
         catch (Exception e) {
            MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
         } 
         finally { 
            if (file != null) { 
               file.Close(); 
            } 
         } 
      } 
   } 
}

Когда вы скомпилируете и выполните приведенный выше код, он создаст следующее окно, в котором текст отображается внутри текстового поля.

Исключительный результат обработки

Когда возникает исключение или вы его выбрасываете вручную (как в следующем коде), тогда появится сообщение с ошибкой.

using System; 
using System.IO; 
using System.Windows;

namespace WPFExceptionHandling {
 
   public partial class MainWindow : Window {
	
      public MainWindow() { 
         InitializeComponent(); 
         ReadFile(0); 
      } 
		
      void ReadFile(int index) { 
         string path = @"D:\Test.txt"; 
         StreamReader file = new StreamReader(path); 
         char[] buffer = new char[80]; 
			
         try { 
            file.ReadBlock(buffer, index, buffer.Length); 
            string str = new string(buffer); 
            throw new Exception(); 
            str.Trim(); 
            textBox.Text = str; 
         }
         catch (Exception e) { 
            MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message); 
         } 
         finally { 
            if (file != null) { 
               file.Close(); 
            } 
         } 
      } 
   } 
}

Если во время выполнения вышеуказанного кода возникнет исключение, будет отображено следующее сообщение.

Сообщение об исключении

Мы рекомендуем вам выполнить приведенный выше код и поэкспериментировать с его функциями.