WPF - обработка исключений
Исключением является любое состояние ошибки или неожиданное поведение, возникающее во время выполнения программы. Исключения могут возникать по многим причинам, некоторые из них следующие:
Ошибка в вашем коде или в коде, который вы вызываете (например, в общей библиотеке),
Недоступные ресурсы операционной системы,
Неожиданные условия, с которыми сталкивается среда CLR (например, код, который невозможно проверить)
Синтаксис
Исключения имеют возможность передавать поток программы из одной части в другую. В .NET framework обработка исключений имеет следующие четыре ключевых слова:
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 прямо или косвенно являются производными от класса Exception. Наиболее важные классы исключений, производные от класса Exception:
ApplicationException class- Он поддерживает исключения, которые генерируются программами. Когда разработчик хочет определить исключение, класс должен быть производным от этого класса.
SystemException class- Это базовый класс для всех предопределенных исключений системы времени выполнения. Следующая иерархия показывает стандартные исключения, предоставляемые средой выполнения.
В следующей таблице перечислены стандартные исключения, предоставляемые средой выполнения, и условия, при которых следует создать производный класс.
Тип исключения | Базовый тип | Описание |
---|---|---|
Exception | Объект | Базовый класс для всех исключений. |
SystemException | Исключение | Базовый класс для всех ошибок времени выполнения. |
IndexOutOfRangeException | SystemException | Выдается средой выполнения только в том случае, если массив неправильно проиндексирован. |
NullReferenceException | SystemException | Выдается средой выполнения только при ссылке на нулевой объект. |
AccessViolationException | SystemException | Выбрасывается средой выполнения только при обращении к недопустимой памяти. |
InvalidOperationException | SystemException | Выбрасывается методами в недопустимом состоянии. |
ArgumentException | SystemException | Базовый класс для всех исключений аргументов. |
ArgumentNullException | ArgumentException | Вызывается методами, которые не позволяют аргументу иметь значение NULL. |
ArgumentOutOfRangeException | ArgumentException | Вызывается методами, которые проверяют, находятся ли аргументы в заданном диапазоне. |
ExternalException | 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();
}
}
}
}
}
Когда при выполнении вышеуказанного кода возникает исключение, отображается следующее сообщение.
Мы рекомендуем вам выполнить приведенный выше код и поэкспериментировать с его функциями.