例外エラーはコードが想定外の扱われ方をすると発生しますが、そのエラーにもいくつか種類があります。メソッドへ渡す引数が間違っていたり、存在しないデータにアクセスしたり、配列に対して範囲を超えたインデックスを指定したりと様々です。
本記事では様々ある例外処理のクラスを簡単なサンプルコードと共にまとめました。Microsoft Docs のドキュメントを参考に作成しています。
参考 Exception クラスMicrosoft Docs
目次
ArgumentException
メソッドの引数が不正な値だった場合のエラー。
引数が null
の場合は ArgumentNullException
が呼ばれます。
引数が有効な値の範囲外の場合は ArgumentOutOfRangeException
が呼ばれます。
void Sample()
{
var list = new List<string>();
string[] tmp = new string[0];
list.Add("A");
list.CopyTo(tmp); // ArgumentException エラー: Destination array was not long enough. Check destIndex and length, and the array's lower bounds
}
ArgumentNullException
メソッドの引数が null
の場合のエラー。
void Sample()
{
string str = null;
Debug.Log(int.Parse(str)); // ArgumentNullException エラー: Value cannot be null.
Debug.Log(Convert.ToInt32(str)); // これは 0 になるので OK
}
ArgumentOutOfRangeException
メソッドの引数が有効な値の範囲外だった場合のエラー。
void Sample()
{
var numbers = new int[] { 1, 2, 3 };
int num = numbers[5]; // IndexOutOfRangeException エラー: Index was outside the bounds of the array.
}
DirectoryNotFoundException
ファイルまたはディレクトリの一部が見つからない場合のエラー。
void Sample()
{
string logFile = "Resources/Sample.txt"; // 存在しないファイルパス
string logData = File.ReadAllText(logFile); // DirectoryNotFoundException エラー: Could not find a part of the path "/(略)/Resources/Sample.txt".
}
DivideByZeroException
整数等を 0 で割り算しようとした場合のエラー。
void Sample()
{
int a = 2;
int b = 0;
int num = a / b; // DivideByZeroException エラー: Attempted to divide by zero.
}
DriveNotFoundException
使用できないドライブ、あるいは共有にアクセスしようとした場合のエラー。
FileNotFoundException
ディスク上に存在しないファイルにアクセスした場合のエラー。
void Sample()
{
string filePath = "/hoge"; // 存在しないパス
StreamReader sr = new System.IO.StreamReader(filePath);
string fileData = sr.ReadToEnd(); // FileNotFoundException エラー: Could not find file "/hoge"
}
FormatException
引数の形式が無効である場合や、文字列の Parse 処理に失敗したとき等のエラー。
void Sample()
{
string num = "10";
Debug.Log(int.Parse(num)); // -> 10
string num2 = "ABC";
Debug.Log(int.Parse(num2)); // FormatException エラー: Input string was not in a correct format.
}
IndexOutOfRangeException
配列やコレクションのインデックスが範囲外の場合に起こるエラー。
void Sample()
{
int[] nums = new int[] { 1, 2, 3 };
Debug.Log(nums[0]); // -> 1
Debug.Log(nums[2]); // -> 3
Debug.Log(nums[5]); // IndexOutOfRangeException エラー: Index was outside the bounds of the array.
}
InvalidOperationException
引数以外の原因で無効なメソッド呼び出しが起きた場合のエラー。
void Sample()
{
var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (var num in nums)
{
if (num == 5)
{
nums.Remove(num); // InvalidOperationException エラー: Collection was modified; enumeration operation may not execute.
}
}
}
KeyNotFoundException
コレクション内の要素に指定されたキーが見つからなかった場合のエラー。
void Sample()
{
var dictionary = new Dictionary<string, int>();
dictionary.Add("one", 1);
dictionary.Add("two", 2);
dictionary.Add("three", 3);
Debug.Log(dictionary["one"]); // -> 1
Debug.Log(dictionary["four"]); // KeyNotFoundException エラー: The given key was not present in the dictionary.
}
NotImplementedException
メソッドまたは操作が実装されてない場合のエラー。
static void func1()
{
throw new NotImplementedException("Not Implemented");
}
static void func2()
{
throw new NotImplementedException("Not Implemented");
}
static void func3()
{
throw new NotImplementedException("Not Implemented");
}
void Sample(int i)
{
switch (i)
{
case 1: func1(); break;
case 2: func2(); break;
case 3: func3(); break;
default: break;
}
}
NotSupportedException
メソッドまたは操作がサポートされてない場合のエラー。
ObjectDisposedException
Dispose 済のオブジェクトに対して操作が行われた場合のエラー。
void Sample()
{
MemoryStream ms = new MemoryStream(16);
ms.Dispose();
ms.ReadByte(); // ObjectDisposedException エラー: Cannot access a closed Stream.
}
OverflowException
算術演算やキャストでオーバーフローが起きた場合のエラー。
void Sample()
{
int value = Int32.MaxValue;
try
{
checked
{
value += 1;
}
}
catch(OverflowException e)
{
Debug.Log(e.Message); // -> Arithmetic operation resulted in an overflow.
}
}
PathTooLongException
パス名やファイル名がシステム定義の最大長を超えた場合のエラー。
完全パスが 260 文字を超えるパスは PathTooLongException の例外がスローされます。
void Sample()
{
var sut = new DirectoryInfo(@"D:\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
try
{
sut.Create();
}
catch (PathTooLongException e)
{
Debug.Log(e.Message);
}
}
PlatformNotSupportedException
ある機能が特定のプラットフォームでサポートされてない場合のエラー。
RankException
間違った次元数の配列がメソッドに渡された場合に起こるエラー。
多次元配列を Array.Reverse
メソッドで逆順にすることはできません。Array.Reverse
メソッドに多次元配列を指定すると、RankException の例外がスローされます。
void Sample()
{
int[] arr1 = {1, 2, 3, 4};
Array.Reverse(arr1); // -> { 4, 3, 2, 1 }
int[,] arr2 = new int[,]{ {1, 2}, {3, 4}, {5, 6} };
Array.Reverse(arr2); // RankException エラー: Only single dimension arrays are supported here.
}
TimeoutException
指定した時間が経過した場合のエラー。
async void Sample()
{
var client = new HttpClient();
// タイムアウトの時間を3秒に設定
client.Timeout = TimeSpan.FromSeconds(3);
try
{
var response = await client.GetStringAsync("https://www.yahoo.co.jp/");
Debug.Log(response);
}
catch (TaskCanceledException e)
{
Debug.Log(e.Message);
}
}
UriFormatException
無効な URI が検出された場合のエラー。
例外エラー早見表
例外エラー | 内容 |
---|---|
ArgumentException | メソッドの引数が不正な値のエラー |
ArgumentNullException | メソッドの引数が null のエラー |
ArgumentOutOfRangeException | メソッドの引数が有効な値の範囲外のエラー |
DirectoryNotFoundException | ファイルやディレクトリが見つからないエラー |
DivideByZeroException | 0 で割り算しようとした場合のエラー |
DriveNotFoundException | 使用できないドライブや共有にアクセスした際のエラー |
FileNotFoundException | ディスク上に存在しないファイルへのアクセスエラー |
FormatException | 引数が無効な場合や文字列の Parse 処理失敗時のエラー |
IndexOutOfRangeException | 配列やコレクションのインデックスが範囲外のエラー |
InvalidOperationException | 引数以外の原因で無効なメソッド呼び出しエラー |
KeyNotFoundException | コレクション内にキーが見つからない場合のエラー |
NotImplementedException | メソッドまたは操作が実装されてない場合のエラー |
NotSupportedException | メソッドまたは操作がサポートされてない場合のエラー |
ObjectDisposedException | Dispose 済のオブジェクトに対しての操作エラー |
OverflowException | 算術演算やキャストでオーバーフローが起きた場合のエラー |
PathTooLongException | パス名やファイル名が定義の最大長を超えた場合のエラー |
PlatformNotSupportedException | 機能が特定のプラットフォームでサポートされてない場合のエラー |
RankException | 間違った次元数の配列がメソッドに渡された際のエラー |
TimeoutException | 指定した時間が経過した場合のエラー |
UriFormatException | 無効な URI が検出された場合のエラー |