WPF - 异常处理

  • 简述

    异常是在程序执行过程中遇到的任何错误情况或意外行为。由于许多原因,可能会引发异常,其中一些原因如下 -
    • 代码或调用的代码(如共享库)中的错误,
    • 不可用的操作系统资源,
    • 公共语言运行库遇到的意外情况(如无法验证的代码)
  • 语法

    异常能够将程序流从一个部分转移到另一个部分。在 .NET 框架中,异常处理具有以下四个关键字 −
    • try − 在此块中,程序标识某个引发异常的条件。
    • 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 语句。
  • 等级制度

    .NET 框架中的几乎所有异常类都是直接或间接派生自异常类的。从异常类派生的最重要异常类是 −
    • 应用程序异常类 − 它支持由程序生成的异常。当开发人员想要定义异常时,类应从此类派生。
    • 系统异常类 − 它是所有预定义的运行时系统异常的基类。以下层次结构显示了运行时提供的标准异常。
    Hierarchy
    下表列出了运行时提供的标准异常以及创建派生类时应遵循的条件。
    异常类型 基本类型 描述:
    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 结构化异常处理信息的异常。

    让我们举一个简单的例子来更好地理解这个概念。首先创建一个名为“WPF异常处理”的新 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" HorizontalMoognment = "Left"
             Height = "241" Margin = "70,39,0,0" TextWrapping = "Wrap" 
             VerticalMoognment = "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
    我们建议您执行上述代码并尝试其功能。