Wpf 简明教程

WPF - Exception Handling

异常是在程序执行期间遇到的任何错误条件或意外行为。异常可以因多种原因而引发,其中一些原因如下:

  1. 代码中的故障或在您调用的代码中(例如共享库),

  2. Unavailable operating system resources,

  3. 公共语言运行时遇到的意外情况(例如无法验证的代码)

Syntax

异常有能力将程序的流程从一部分转移到另一部分。在 .NET 框架中,异常处理有以下四个关键字:

  1. try — 在此块中,程序识别引发某个异常的特定条件。

  2. catch — catch 关键字表示捕获异常。 try 块后跟一个或多个 catch 块,以在程序中您希望处理问题的位置用异常处理程序来捕获异常。

  3. finally − 无论是否抛出异常,finally 块都用于执行给定的语句组。例如,如果你打开了一个文件,那么无论是否引发异常,都必须关闭它。

  4. 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

NET 框架中几乎所有的异常类直接或间接地派生自 Exception 类。派生自 Exception 类最重要的异常类有:
  1. ApplicationException class — 它支持由程序生成的异常。当开发人员想要定义异常时,类应该派生自此类。

  2. SystemException class — 它是所有预定义的运行时系统异常的基类。以下层次结构显示了运行时提供的标准异常。

hierarchy

下表列出了运行时提供的标准异常和您应该创建派生类的条件。

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();
            }
         }
      }
   }
}

当你编译并执行以上代码时,它将在其中一个文本框内显示一个文本的窗口。

exceptional handling output

当抛出一个异常或手动抛出一个异常时(如以下代码中所示),它会显示一个带错误的消息框。

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();
            }
         }
      }
   }
}

当在执行以上代码时抛出一个异常时,它将显示以下消息。

exception message

我们建议你执行以上的代码并体验其功能。