例外を「投げる」とは?throwの考え方を整理する【C# 初心者向け】

C#

はじめに

これまで、

  • 例外とは何か
  • よく見る例外の種類

をまとめてきました。

今回は少し視点を変えて、
「例外を受け取る側」ではなく「投げる側」について考えてみます。

最初は「投げるって何?」という状態でも大丈夫です。

例外を「投げる」とは?

例外を投げるとは、
「ここはおかしいですよ」とプログラムに知らせることです。

イメージとしては、

通常処理

想定外の状態

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の危険性
  • ログの重要性
  • デバッグが難しくなる理由

少しだけ実践寄りの話に進みます。