MeWrite Docs

ArgumentException: Value does not fall within the expected range

C#でメソッドに無効な引数が渡された場合に発生するエラー

概要

ArgumentException は、メソッドに渡された引数が無効な場合に発生する例外です。引数の値が期待される範囲や形式に合わない場合にスローされます。

エラーメッセージ

System.ArgumentException: Value does not fall within the expected range.
System.ArgumentException: An item with the same key has already been added.
System.ArgumentException: The path is not of a legal form.

原因

1. 重複キーの追加

1
2
3
var dict = new Dictionary<string, int>();
dict.Add("key", 1);
dict.Add("key", 2); // ArgumentException: 同じキーが既に存在

2. 無効なパス文字列

1
2
string path = "C:\\invalid<path>";
File.ReadAllText(path); // ArgumentException: 無効な文字を含む

3. 空文字列や空白のみ

1
2
3
4
5
public void SetName(string name)
{
    if (string.IsNullOrWhiteSpace(name))
        throw new ArgumentException("名前は空にできません", nameof(name));
}

解決策

1. 事前チェックを追加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
var dict = new Dictionary<string, int>();
string key = "key";

if (!dict.ContainsKey(key))
{
    dict.Add(key, 1);
}
else
{
    dict[key] = 1; // 上書き
}

// または TryAdd を使用(.NET Core 2.0+)
dict.TryAdd(key, 1);

2. パス文字列の検証

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
string path = userInput;
char[] invalidChars = Path.GetInvalidPathChars();

if (path.IndexOfAny(invalidChars) >= 0)
{
    Console.WriteLine("無効な文字がパスに含まれています");
}
else
{
    File.ReadAllText(path);
}

3. ガード句の使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public void ProcessData(string data)
{
    // ArgumentException の派生クラスを使用
    if (data == null)
        throw new ArgumentNullException(nameof(data));

    if (string.IsNullOrWhiteSpace(data))
        throw new ArgumentException("データは空にできません", nameof(data));

    // 処理続行
}

4. try-catchで処理

1
2
3
4
5
6
7
8
9
try
{
    dictionary.Add(key, value);
}
catch (ArgumentException ex)
{
    Console.WriteLine($"キーの追加に失敗: {ex.Message}");
    dictionary[key] = value; // 代わりに上書き
}

ArgumentExceptionの派生クラス

例外用途
ArgumentNullException引数がnullの場合
ArgumentOutOfRangeException引数が範囲外の場合
ArgumentExceptionその他の無効な引数
1
2
3
4
5
public void SetAge(int age)
{
    if (age < 0 || age > 150)
        throw new ArgumentOutOfRangeException(nameof(age), "年齢は0〜150の範囲で指定してください");
}

関連エラー

関連エラー

C# の他のエラー

最終更新: 2025-12-17