This article has been localized into Japanese by the community.
WPFの例外ハンドリング
もしあなたがC#やWPFの使用できる.NET言語に精通しているなら、例外ハンドリングは目新しいものではありません。例外を投げる可能性があるコードではいつでも、例外を簡潔にハンドルするためこれをtry-catchブロックで囲むべきです。例えば、次の例を考えましょう。
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
これは明らかに間違っています。null値の変数にTime()メソッドを実行しようとしているからです。もし例外をハンドルしていない場合、アプリケーションはクラッシュし、Windowsがこれを処置します。これは全くユーザーフレンドリーではありません。
この場合、このような単純で簡単に回避できるエラーのせいで、ユーザーはアプリケーションを強制終了するでしょう。なので、うまく行かない可能性が有ることが分かっている場合はtry-catchブロックを使うべきです。
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);
}
}
しかしながら、最も単純なコードでさえ例外を投げることがあります。コードの全ての行をtry-catchブロックでかこむ代りにWPFは全てのハンドルされていない例外をグローバルにハンドルしてくれます。これはApplicationクラスのDispatcherUnhandledExceptionイベントを通じて行われます。サブスクライブしている場合、ハンドルされていない例外が投げられるとサブスクライブされたメソッドが実行されます。ここにちょうど今行ったものに基づいた、完全な例があります。
<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ブロックの外で、余分のTrim()メソッドを呼び出していることに注意して下さい。最初の呼び出しはハンドルされますが2回目はされません。2回目の呼び出しのために、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.Error);
e.Handled = true;
}
}
}
例外はローカルの例外と同じように処理されますが、メッセージボックスのテキストとイメージが少し違います。e.Handledプロパティをtrueに設定していることにも注意して下さい。これはWPF に例外の処理は行ったので他に何もする必要がないと指示しています。
まとめ
例外のハンドルはアプリケーションの大変重要な部分だが、幸い、WPFと.NETはローカルとグローバルの例外ハンドルが大変簡単に出来ます。例外が理にかなっている場合はローカルの例外ハンドルを使うべきです。またグローバルの例外ハンドルは万が一の滑り止めとしてのみ使います。ローカルの例外ハンドルはより具体的で個別の方法で問題への対処ができるからです。