この章のテーマ §
throw文について学びます。普段なら起きて欲しくない例外をあえて発生させることができます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, 条件演算子, int型, for文, new 演算子, *=演算子. クラスの基礎, 継承の基礎
解説 §
プログラムで何か想定外の異常な状態が起きた時、それを伝える方法は、大きく分けると特別な値を返す方法と、例外を発生させる方法があります。一般的には例外が重い処理であり利用は好まれませんが、希にしか起こらない場合などでは例外も使われます。
ここで重要なことは以下の2点です。
- 例外は自作できます
- 例外は発生させたいときに発生できます
例外を自作する場合は、Exceptionクラスを継承していくつかのメンバーを用意するだけです。ドキュメントに書かれたテンプレート通りに書くだけで、システムには存在しないあなただけの独自例外が作成できます。
例外を発生させるには、throw文を使用します。例外クラスをnew演算して作成してthrow文で指定するとそれを発生できます。
罠の数々 §
- もちろん、こうやって産み出された例外であっても、try-catch構文でキャッチできる
- 繰り返すが、例外を使うのも使わないのもあなたの判断で決めて良い。逆にいえば、どちらが有利か判断するスキルは持っていた方が良い
- throw文で使う例外はnew演算子で作成することが必須である。(希に特殊な使い方としてnew演算子を使わないケースもあり得る)
- キャッチした例外を再発生させるときは、引数無しのthrow;で良い。扱えると思ってキャッチしたけど、やっぱり扱えないので例外を改めて発生させる時に便利
参考リンク §
例外の作成とスロー
サンプルソース: kw_throw §
int x = 1;
for (int i = 0; i < 8; i++)
{
if (x > 100) throw new MySampleException("xが100を超えました。");
x *= 2;
}
[Serializable]
public class MySampleException : Exception
{
public MySampleException() : base() { }
public MySampleException(string message) : base(message) { }
public MySampleException(string message, Exception inner) : base(message, inner) { }
// A constructor is needed for serialization when an
// exception propagates from a remoting server to the client.
protected MySampleException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
}
実行結果 (IDEで実行した場合は見え方が異なる) §
Unhandled exception. MySampleException: xが100を超えました。
at Program.<Main>$(String[] args) in C:\xgh\CSharpPrimer2\kw_throw\kw_throw\Program.cs:line 4
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
例外を発生させるときに指定する文字列として望ましい条件【ではないもの】を選べ。
- なぜ例外が起きたのか、理由をはっきりさせる
- 原因が明確に分かるようにする
- 利用者のIDとパスワードを必ず付ける
- 発生場所は別途用意されているので、特にメッセージに含める必要はない
- 例外処理中に例外が起きないように注意する (それはそのままではキャッチされない)
[[解答]]