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

当执行上述代码时引发异常时,它将显示以下消息。

异常信息

我们建议您执行上述代码并试验其功能。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁