WPF - obsługa wyjątków
Wyjątkiem jest każdy stan błędu lub nieoczekiwane zachowanie napotkane podczas wykonywania programu. Wyjątki można zgłaszać z wielu powodów, niektóre z nich są następujące -
Błąd w kodzie lub w kodzie, który wywołujesz (na przykład w bibliotece współdzielonej),
Niedostępne zasoby systemu operacyjnego,
Nieoczekiwane warunki, które napotyka środowisko uruchomieniowe języka wspólnego (na przykład kod, którego nie można zweryfikować)
Składnia
Wyjątki mają możliwość przenoszenia przepływu programu z jednej części do drugiej. W .NET Framework obsługa wyjątków ma następujące cztery słowa kluczowe -
try - W tym bloku program identyfikuje pewien warunek, który wywołuje wyjątek.
catch- Słowo kluczowe catch wskazuje na przechwycenie wyjątku. ZAtry po bloku następuje jeden lub więcej catch bloków do przechwytywania wyjątków z obsługą wyjątków w miejscu w programie, w którym chcesz obsłużyć problem.
finally- Ostatni blok jest używany do wykonania danego zestawu instrukcji, niezależnie od tego, czy wyjątek został zgłoszony, czy nie. Na przykład, jeśli otworzysz plik, musi zostać zamknięty, niezależnie od tego, czy został zgłoszony wyjątek, czy nie.
throw- Program zgłasza wyjątek, gdy pojawia się problem. Odbywa się to za pomocą słowa kluczowego throw.
Składnia użycia tych czterech słów kluczowych wygląda następująco:
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
}
Wiele instrukcji catch jest używanych w przypadkach, gdy blok try może zgłosić więcej niż jeden wyjątek w zależności od sytuacji w przepływie programu.
Hierarchia
Prawie wszystkie klasy wyjątków w środowisku .NET pochodzą bezpośrednio lub pośrednio z klasy Exception. Najważniejsze klasy wyjątków wywodzące się z klasy Exception to -
ApplicationException class- Obsługuje wyjątki, które są generowane przez programy. Gdy programista chce zdefiniować wyjątek, klasa powinna pochodzić z tej klasy.
SystemException class- Jest to klasa bazowa dla wszystkich predefiniowanych wyjątków systemu wykonawczego. Poniższa hierarchia przedstawia standardowe wyjątki zapewniane przez środowisko uruchomieniowe.
W poniższej tabeli wymieniono standardowe wyjątki zapewniane przez środowisko uruchomieniowe oraz warunki, w których należy utworzyć klasę pochodną.
Typ wyjątku | Typ podstawowy | Opis |
---|---|---|
Exception | Obiekt | Klasa podstawowa dla wszystkich wyjątków. |
SystemException | Wyjątek | Klasa podstawowa dla wszystkich błędów generowanych w czasie wykonywania. |
IndexOutOfRangeException | SystemException | Zgłaszane przez środowisko wykonawcze tylko wtedy, gdy tablica jest niepoprawnie indeksowana. |
NullReferenceException | SystemException | Zgłaszane przez środowisko uruchomieniowe tylko wtedy, gdy przywołuje się obiekt o wartości null. |
AccessViolationException | SystemException | Zgłaszane przez środowisko wykonawcze tylko w przypadku uzyskania dostępu do nieprawidłowej pamięci. |
InvalidOperationException | SystemException | Zgłaszane przez metody w nieprawidłowym stanie. |
ArgumentException | SystemException | Klasa bazowa dla wszystkich wyjątków argumentów. |
ArgumentNullException | ArgumentException | Zgłaszane przez metody, które nie pozwalają na zerową wartość argumentu. |
ArgumentOutOfRangeException | ArgumentException | Zgłaszane przez metody, które sprawdzają, czy argumenty znajdują się w podanym zakresie. |
ExternalException | SystemException | Klasa podstawowa dla wyjątków, które występują lub są przeznaczone dla środowisk poza środowiskiem wykonawczym. |
SEHException | Wyjątek zewnętrzny | Wyjątek hermetyzujący informacje dotyczące obsługi wyjątków strukturalnych Win32. |
Przykład
Weźmy prosty przykład, aby lepiej zrozumieć koncepcję. Zacznij od utworzenia nowego projektu WPF o nazwieWPFExceptionHandling.
Przeciągnij jedno pole tekstowe z przybornika do okna projektu. Poniższy kod XAML tworzy pole tekstowe i inicjuje je z niektórymi właściwościami.
<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>
Oto odczyt pliku z obsługą wyjątków w 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();
}
}
}
}
}
Kiedy kompilujesz i wykonujesz powyższy kod, utworzy on następujące okno, w którym tekst jest wyświetlany w polu tekstowym.
Gdy zostanie zgłoszony wyjątek lub zostanie zgłoszony ręcznie (jak w poniższym kodzie), zostanie wyświetlone okno komunikatu z błędem.
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();
}
}
}
}
}
Gdy wyjątek zostanie zgłoszony podczas wykonywania powyższego kodu, wyświetli następujący komunikat.
Zalecamy wykonanie powyższego kodu i eksperymentowanie z jego funkcjami.