如果你语言#可能其他任何你都可以配合 WPF 使用的 .NET,那么出现的情况对你来说可能不知道:当你有一段程序代码有机会抛出错误,通过「try-应该抓住」一部分包住它来了地方处理问题。举例说明,请思考下面的例子:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
继续,因为这个节目对一个现实是空的变数使用「Trim()」方法,会产生错误。你所见,这对人类相当不友善:
在这个约会对象中,用户会因为很容易陷入困境而不会发生的错误。所以如果你知道一些可能会出错的应用程序,你就应该使用“尝试捕捉”部分,例如:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
try
{
s.Trim();
}
catch(Exception ex)
{
MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
然而,意外是最容易的程序码也可能抛出异常,WPF让你全域处理所有处理的异常,而是以“试一试”的方式包覆整个行程码。 「应用」类别里的「DispatcherUnhandledException」事件来实现。如果订阅了该事件,用户有在程序码中未处理异常爆炸抛出时,WPF 将呼叫订阅的方法以下是一个基于我们的方法。讨论过东西的完整例子:
<Window x:Class="WpfTutorialSamples.WPF_Application.ExceptionHandlingSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ExceptionHandlingSample" Height="200" Width="200">
<Grid>
<Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click">
Do something bad!
</Button>
</Grid>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ExceptionHandlingSample : Window
{
public ExceptionHandlingSample()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
try
{
s.Trim();
}
catch(Exception ex)
{
MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
}
s.Trim();
}
}
}
请注意这个我在「try-catch」一些外面额外呼叫了一次「修剪」方法,所以第一次呼叫有被处理,而第二次呼叫则没有。为了这个第二次呼叫,我们需要「App.xaml」的魔法。
<Application x:Class="WpfTutorialSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DispatcherUnhandledException="Application_DispatcherUnhandledException"
StartupUri="WPF Application/ExceptionHandlingSample.xaml">
<Application.Resources>
</Application.Resources>
</Application>
using System;
using System.Windows;
namespace WpfTutorialSamples
{
public partial class App : Application
{
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
e.Handled = true;
}
}
}
我们处理此区域区域性的处理方式与相当接近,仅在消息框中有非常多的文字和不同的图片。也请我将“e.处理”属性设置为“真实”,这将告知 WPF 我们已处理完成此异常且没有其他相关事项需要完成。
处理是非常应用程序重要的一个部分,而任何地方 WPF 和 .NET 使所在区域或全域的异常处理都非常容易。你应该在合理的处理情况下采用区域性问题,并且只使用全域性问题处理作为最后的防线机制。