WPF – 异常处理
WPF – 异常处理
异常是在程序执行期间遇到的任何错误条件或意外行为。由于多种原因可能会引发异常,其中一些如下 –
-
您的代码或您调用的代码中的错误(例如共享库),
-
不可用的操作系统资源,
-
公共语言运行时遇到的意外情况(例如无法验证的代码)
句法
异常具有将程序流从一个部分转移到另一个部分的能力。在 .NET 框架中,异常处理有以下四个关键字 –
-
try – 在此块中,程序识别出引发某些异常的特定条件。
-
catch – 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 语句。
等级制度
.NET 框架中几乎所有的异常类都是直接或间接派生自 Exception 类。从 Exception 类派生的最重要的异常类是 –
-
ApplicationException 类– 它支持由程序生成的异常。当开发人员想要定义异常时,类应该从这个类派生出来。
-
SystemException 类– 它是所有预定义的运行时系统异常的基类。以下层次结构显示了运行时提供的标准异常。
下表列出了运行时提供的标准异常以及创建派生类的条件。
Exception type | 基础类型 | 描述 |
---|---|---|
Exception | 目的 | 所有异常的基类。 |
SystemException | 例外 | 所有运行时生成的错误的基类。 |
IndexOutOfRangeException | 系统异常 | 仅当数组索引不正确时由运行时抛出。 |
NullReferenceException | 系统异常 | 仅在引用空对象时由运行时抛出。 |
AccessViolationException | 系统异常 | 仅在访问无效内存时由运行时抛出。 |
InvalidOperationException | 系统异常 | 处于无效状态时被方法抛出。 |
ArgumentException | 系统异常 | 所有参数异常的基类。 |
ArgumentNullException | 参数异常 | 由不允许参数为空的方法抛出。 |
ArgumentOutOfRangeException | 参数异常 | 由验证参数在给定范围内的方法抛出。 |
ExternalException | 系统异常 | 发生或针对运行时之外的环境的异常的基类。 |
SEHException | 外部异常 | 异常封装 Win32 结构化异常处理信息。 |
例子
让我们举一个简单的例子来更好地理解这个概念。首先创建一个名为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(); } } } } }
当执行上述代码时引发异常时,它将显示以下消息。
我们建议您执行上述代码并试验其功能。