Wpf 简明教程
WPF - Exception Handling
异常是在程序执行期间遇到的任何错误条件或意外行为。异常可以因多种原因而引发,其中一些原因如下:
-
代码中的故障或在您调用的代码中(例如共享库),
-
Unavailable operating system resources,
-
公共语言运行时遇到的意外情况(例如无法验证的代码)
Syntax
异常有能力将程序的流程从一部分转移到另一部分。在 .NET 框架中,异常处理有以下四个关键字:
-
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
}
在根据程序流的情况,一个 try 块可以引发多个异常的那些情况下,会使用多个 catch 语句。
Hierarchy
-
ApplicationException class — 它支持由程序生成的异常。当开发人员想要定义异常时,类应该派生自此类。
-
SystemException class — 它是所有预定义的运行时系统异常的基类。以下层次结构显示了运行时提供的标准异常。
下表列出了运行时提供的标准异常和您应该创建派生类的条件。
Exception type |
Base type |
Description |
Exception |
Object |
所有异常的基类。 |
SystemException |
Exception |
所有运行时生成错误的基类。 |
IndexOutOfRangeException |
SystemException |
当数组索引不当时,仅由运行时抛出。 |
NullReferenceException |
SystemException |
只有在引用 null 对象时才由运行时抛出。 |
AccessViolationException |
SystemException |
只有在访问无效内存时才由运行时抛出。 |
InvalidOperationException |
SystemException |
在无效状态下,由方法抛出。 |
ArgumentException |
SystemException |
所有参数异常的基类。 |
ArgumentNullException |
ArgumentException |
在不允许参数为 null 的情况下由方法抛出。 |
ArgumentOutOfRangeException |
ArgumentException |
在验证参数位于给定范围内的情况下由方法抛出。 |
ExternalException |
SystemException |
适用于运行时外部环境中发生的或针对该环境的异常的基类。 |
SEHException |
ExternalException |
封装 Win32 结构化异常处理信息的异常。 |
Example
让我们用一个简单的示例更深入地理解这个概念。首先创建一个带有名称 WPFExceptionHandling 的新 WPF 项目。
将一个文本框从工具箱拖拽到设计窗口。以下 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();
}
}
}
}
}
当在执行以上代码时抛出一个异常时,它将显示以下消息。
我们建议你执行以上的代码并体验其功能。