はじめに
これまで、
- 例外とは何か
- よく見る例外の種類
をまとめてきました。
今回は少し視点を変えて、
「例外を受け取る側」ではなく「投げる側」について考えてみます。
最初は「投げるって何?」という状態でも大丈夫です。
例外を「投げる」とは?
例外を投げるとは、
「ここはおかしいですよ」とプログラムに知らせることです。
イメージとしては、
通常処理
↓
想定外の状態
↓
throw(ここはおかしい!)
↓
呼び出し元へ伝わるという流れです。
throwの基本形
throw new Exception("エラーが発生しました");これを書くと、
その場所で例外が発生します。
例:値が不正なときに例外を投げる
例えば、金額がマイナスだった場合。
public void SetAmount(int amount)
{
if (amount < 0)
{
throw new ArgumentException("金額は0以上である必要があります");
}
_amount = amount;
}ここでは、
- マイナス金額は想定外
- だから例外を投げる
という考え方をしています。
なぜ例外を自分で投げるの?
初心者のうちは、
「エラーは勝手に出るもの」
という感覚が強いかもしれません。
でも実際には、
- 入力値がおかしい
- 前提条件が守られていない
といったケースは、
自分でチェックして例外を投げることも大切です。
これは、
「このメソッドはこういう条件でしか使えませんよ」
と明確にするための仕組みでもあります。
returnと何が違う?
例えばこう書くこともできます。
if (amount < 0)
{
return;
}これでもエラーは防げます。
でも、
「なぜ処理が止まったのか」が分かりません。
例外を投げると、
- 問題が起きたことがはっきりする
- 呼び出し元で対応できる
という違いがあります。
例外は“最後の防衛線”
例外は、
「ここまで来たらおかしい」という最終チェックのようなものです。
イメージすると、
入力チェック(想定内)
↓
通常処理
↓
想定外発見
↓
throw(最終防衛線)全部を例外にする必要はありません。
- 想定内 → ifで分岐
- 想定外 → throw
という考え方が分かりやすいです。
カスタム例外って何?
例外は自分で作ることもできます。
public class InvalidAmountException : Exception
{
public InvalidAmountException(string message)
: base(message)
{
}
}これを使うと、
throw new InvalidAmountException("金額が不正です");のように書けます。
「どんな問題が起きたのか」を明確にしたいとき
に使うものだと覚えておけば十分です。
まとめ
例外は、
- 起きたエラーを受け取るだけでなく
- 必要なら自分で投げることもできる
という仕組みです。
throwは、
- なんでもエラーにするためのものではなく
- 「これはおかしい」と伝えるためのもの
だと理解しておくと分かりやすいです。
まずは、
- 前提条件をチェックする
- 想定外なら例外を投げる
この考え方を少しずつ身につけていけば十分です。
次回予告
次は、
例外を握りつぶしてはいけない理由
についてまとめてみます。
- 空のcatchの危険性
- ログの重要性
- デバッグが難しくなる理由
少しだけ実践寄りの話に進みます。
