フッターコンテンツにスキップ
Iron Academy Logo
C#アプリケーション
C#アプリケーション

その他のカテゴリー

概要: C# Windowsフォームアプリケーションにおけるエラー処理

Tim Corey
23m 09s

"C#アプリの初めから終わりまで"のシリーズの第25回目のレッスンで、Tim Coreyは重要ですがしばしば誤解されがちなトピック:C# Windows Formsアプリケーションにおけるエラー処理に焦点を当てています。 Timは、エラー処理が単にtry-catchブロックをどこにでも投げることではなく、無効な入力、予期しない状況、ユーザーのミスにアプリケーションがどのように応答するかを意図的に設計することであると説明します。

このレッスンでは、シリーズで以前に構築したトーナメントビューアフォームを使用した実例をTimが案内します。 エラーがどのように発生し、それらがどのように処理されるべきかを見ることで、アプリケーションが失敗すべき時、実行を停止すべき時、意味のあるフィードバックをユーザーに提供すべき時についての深い実践的な理解を得ることができます。 動画から直接、Timのステップバイステップの説明を詳しく見てみましょう。

問題の理解: 未処理の例外

レッスンの始めに、Timは既存のトーナメントビューアフォームに基本的なエラー処理を追加することを目標として紹介します。 彼はすぐに実際の問題を示します。両方のチームに同じスコアが与えられ、"スコア"ボタンがクリックされると、アプリケーションは例外を投げます。

Timは、この動作はVisual Studioでは見えるが、最終ユーザーにとっては状況がさらに悪いことを説明します。 アプリケーションが.exeとして実行されている場合、エラーメッセージが表示された後、メッセージボックスが閉じるとアプリケーションがクラッシュします。 それは、Timが強調するように、ユーザー向けアプリケーションにとって許容できない動作です。

なぜ包括的なTry-Catchブロックが悪い考えか

Timは次に、開発者がよく犯す間違いについて議論します:メソッド全体をtry-catchブロックで囲んでそれを"エラー処理"と呼ぶこと。彼はこのアプローチを強く批判し、それを真の処理というよりも"エラーお食事"に近いと呼びます。

この時点で、Timは重要な哲学を説明します:アプリケーションが予期しない方法で失敗する場合、それは真に壮大に失敗すべきであるということです。 エラーを黙って隠すと、デバッグが難しくなり、破損した状態が拡がります。 エラーは、ユーザーによって引き起こされ、予期されるものである場合にのみ捕捉されるべきです。

UI層でのターゲットのTry-Catch

すべてを囲むのではなく、Timは失敗する可能性のあるコード行の周りにだけtry-catchブロックを適用する方法を示します。 彼はスコアリングロジックをtryブロックで囲み、名前付き変数でExceptionを捕捉することを示します。

Timはここで2つのベストプラクティスを強調します:

  • 常に例外変数に名前を付け、詳細にアクセスできるようにします。

  • throw ex;を使用して再スローしてはいけません なぜなら、これは重要なスタックトレース情報を破壊します。 代わりに、throw;を使用します 再スローが必要な場合。

この場合、エラーがUIで発生するため、Timはその場で例外メッセージを示すMessageBoxを表示して処理することを選びます。

MessageBoxでのユーザーフィードバックの改善

Timは、ユーザーに明確なエラーメッセージを表示するためのMessageBox.Show呼び出しを追加します。 再び引き分けのスコアが入力されると、クラッシュする代わりに、アプリケーションは以下を表示します:

"このアプリケーションで次のエラーが発生しました: このアプリケーションでは引き分けは許可されていません。"

Timは、これはすでに大きな改善であることを指摘します。 エラーは処理され、データベースは更新されず、アプリケーションは安全に稼働し続けます。

ユーザーを信用しない: 入力検証

Timの基本原則の一つはここで明確に繰り返されています: ユーザーを信用しない。

この段階では、アプリケーションはユーザーが有効な数値のスコアを入力することを仮定しています。 Timはこれが危険である理由と、処理を試みる前にユーザーの入力を検証するというアイデアを紹介します。

彼はIsValidDataというプライベートメソッドを作成し、以下を検査します:

  • 両方のスコア入力が有効な数字であるかどうか

  • 両方のスコアがゼロであるかどうか

  • スコアが引き分けであるかどうか

最初、このメソッドはbool値を返し、呼び出し元コードが実行を停止し、一般的なエラーメッセージを表示することができます。

ブール値の検証から詳細なエラーへ

Timは"有効なデータを入力する必要があります"という一般的なメッセージでは満足しません。 彼は、良いエラー処理はユーザーに正確に何が問題だったかを教えるべきだと説明します。

これを改善するために、彼は検証メソッドをboolではなく文字列を返すように変更します。 空の文字列はエラーがないことを意味します; そうでなければ、文字列には特定のメッセージが含まれます。例えば:

  • "スコア1の値は有効な数字ではありません"

  • "どちらのチームにもスコアを入力しませんでした"

  • "このアプリケーションでは引き分けは許可されていません"

これにより、UIが曖昧な警告ではなく、ターゲットを絞った意味のあるメッセージを表示することができます。

Else-Ifチェーンでロジックエラーを修正

テストの結果、Timはロジックの欠陥に気づきました:無効な数値入力が時々"引き分けは許可されていない"というメッセージを引き起こします。 彼はその理由を説明します—数値解析に失敗すると値がゼロに設定され、個別のif文が後の条件を前のメッセージで上書きできることです。

これを修正するために、Timは検証チェックをelse-ifチェーンに変換します。 これにより、あるエラー条件が満たされると、それ以降の条件はスキップされます。 Timはこれがロジックをより明確に、安全に、維持しやすくすることを説明します。

エラー処理はTry-Catchだけではない

Timは一歩下がり、重要な要点を明確にしようとします: エラー処理は必ずしもtry-catchブロックの使用を意味するものではありません。

手動検証—処理の前にユーザー入力のチェック—も同様に重要です。 早期にバリデーションを行うことで、アプリケーションは不良データがデータベースやビジネスロジックに到達するのを防ぎます。

彼はまた、すべてを検証する必要はないことを説明します。 プルダウンやリストボックスなどの閉じたシステムは既に入力を制限しています。 しかし、自由形式のテキストフィールドは常に検証されなければなりません。

エラー処理はどこにあるべきか

レッスンの終わりに向けて、Timはよくある質問に答えます:エラー処理はどこに行うべきか?

彼の目安としてのルール:

  • バリデーションは、バックエンドも含むアプリケーションを通じて存在すべきです。

  • 例外は通常、フロントエンドで捕捉されるべきです。なぜなら、そこがユーザーに情報を伝えられる場所だからです。

Timは、バックエンドでの例外処理はシステムが回復できる場合にのみ理にかなっていると述べます—例えば、SQLが利用できない場合にSQLデータベースからテキストファイルに切り替えるなど。

エラー処理に関する最終的な考え

Timは、良いエラー処理がアプリケーションの安定性、ユーザーエクスペリエンス、長期的な保守性を向上させると教えながら結論を出します。 彼は包括的なtry-catchブロックに対して警告し、開発者にバリデーションと例外の流れについて意図的に考えることを奨励します。

このレッスンは、ユーザーを案内し、データを保護し、必要な場合に安全に失敗するためのWindows Formsアプリケーションを構築するための基盤を築きます。

Hero Worlddot related to 概要: C# Windowsフォームアプリケーションにおけるエラー処理
Hero Affiliate related to 概要: C# Windowsフォームアプリケーションにおけるエラー処理

好きなことを共有することで収入を増やす

.NET、C#、Java、Python、またはNode.jsを使用する開発者向けのコンテンツを作成しますか?あなたの専門知識を副収入に変えましょう!

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね