UnityC#の例外処理の使い方 throw, try, catch, finally文について

例外処理についての画像 Unity C#入門講座
例外処理はアプリ実行時に想定していないことが起きた時に利用できる機能。


Unity入門の森オリジナル本格ゲーム制作講座はこちら
5種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

今回の記事では例外処理について解説していきます。

例外処理はアプリ実行時に予想していない自体が発生した時に使用するC#の機能になります。

例外処理をマスターしてばっちりエラーハンドリングしていきましょう。

前回の記事:

Unity C#のIEnumerable・IEnumeratorとコルーチンの使い方・作り方
今回の記事ではコレクションに関係するIEnumearbleとIEnumeratorについて解説していきます。 IEnumerableおよびIEnumeratorはコレクションの要素を取り出す操作を一般化したものになります。少し理解しづらい...

【Line登録者限定のプレゼントもあるよ!】

例外処理とは

例外処理とはアプリ実行中に想定していないデータが現れたり、指定したファイルが存在しない時など想定外の処理が実行された時に使用できるC#の機能になります。

例えば参照型にnullが入っているときにメンバへアクセスした時や、配列の要素数以上の添字を指定したときに発生します。

例外の投げ方(throwキーワード)

throwキーワードについての画像

throwキーワードを使用すると例外を投げることができる。

C#やUnityの機能を間違って使用した時には例外が発生します。また、throwキーワードを使用することでこちらから任意の例外を発生(※)させることができます。

発生させる例外は必ずSystem.Exception型継承したものにしてください。

(※例外を発生させることを例外を投げると言います。)

  • 例外の投げ方:throw <投げる例外の型>;

例外が発生しますとアプリはその時点で処理を終了しますので、基本的に例外が発生しない様にプログラムを作成していきましょう!

発生した例外の対処法について(try-catch文)

try-catch文についての画像

try文の中に例外が発生する可能性がある処理を書く。catch文では発生する例外ごとに対処処理を書いていく。

例外が発生した時はtry-catch文を書くことでその例外を検知、対処できます。

try-catch文の書き方は例外が発生するかもしれない場所に次のようにブロックで括ってください。

  • try-catch文の書き方:try { <例外が発生するかもしれない処理> } catch (<発生する例外の型> <変数名>) { ... }

一つのtry文にcatch文は二つ以上書くことができます。例外が発生した場合、基本的には上に書いたcatch文が優先的に実行されます。

しかし、型が合わない場合は投げられた例外と型変換が可能な型を指定したcatch文の処理が実行されます。

もしcatch文と一致しない例外が投げられた時はその例外は無視されます。この時の処理は次の項目で説明します。

対処できなかった例外について

対処できなかった例外についての画像

対処できなかった例外が起きた時は呼び出し元に戻り、対処できるか確認する。もしメソッドコールスタックに対処できるメソッドがなければそこでアプリの実行を中断する。

try-catch文がないなど、もし発生した例外を対処できなかった場合はシステム側が次の手順をとります。

例外が発生した時の処理の流れ

  1. try-catch文の中で発生したら、その中で対処する。
  2. もしtry-catch文と一致していない例外try-catch文の外で発生したなら、メソッドを呼び出したメソッドの中を探す。
  3. 1に戻る。もし呼び出しメソッドがなければそこでアプリを終了する。

System.Exceptionをcatch文で用いると全ての例外に対応できるので、例外を必ず対処したい時に利用してください。

メソッドコールスタックについて

メソッドを呼び出した順はアプリによって記録されています。このことをメソッドコールスタック(Method Call Stack)などと呼んだりします。

コールスタックにはサイズ上限があります。もし上限を超えてしまった場合でも例外(System.StackOverflowException)が発生しますので覚えておくといいでしょう。

catch文の中のthrowキーワードについて

catch文の中のthrowキーワードについての画像

catch文の中でthrowキーワードを使用すると、対処中の例外を呼び出し元に投げることができる。

catch文の中でもthrowキーワードを書くことができます。その場合はcatch文に渡された例外をこのメソッドの呼び出し元へ投げます

finally文について

finally文についての画像

finally文は例外が発生した時の共通した後処理を行いたい時に使用できる。

try-catch文の最後にfinally文を書くことで例外が発生した時に共通した後処理を書くことができます。

例外の自作の仕方について

例外型は自作できるの画像

例外型は自作できる。その時は必ずSystem.Exception型を規定クラスとして派生しないといけないのに注意。

C#やUnityではあらかじめいくつかの例外型が提供されています。これらの例外型はどれもSystem.Exceptionを継承しています。

  • IndexOutOfRangeException:添字アクセスエラー
  • NullReferenceException:nullアクセスエラー
  • FileNotFoundException:ファイルが存在しないというエラー
  • ArgumentException:メソッドの引数が原因のエラー
  • DivideByZeroException:0除算エラー
  • InvalidCastException:型変換に失敗した時のエラー
  • StackOverflowException:メソッドコールスタックの上限を超えた時のエラー
  • などなど

上にあげた以外の例外ももちろん自作できます。自作する際は必ずSystem.Exceptionを継承してください。

【実践】Unityで例外を体験してみよう!

それでは実際にUnityで例外を体験してみましょう!

Unityで例外が発生した時は発生源のコンポーネントの処理はその時点で中断されますが、アプリ全体の処理は止まりません

そのため次の画像の様に同じエラーが大量に発生します。(これまで、アプリでエラーを起こしたことがある方は既にみたことがあるかもしれません。)

例外発生時のエラーログの画像

Unityでは例外が発生してもアプリは中断しない。代わりに例外が発生したコンポーネントは発生時点で処理を中断するのに注意。

今回のサンプルでは例外が起きてもエラーを出さない様にしてみましょう!

サンプル実行例の画像

try-catch文によって例外が発生してもエラーログが発生しなくなっている。

今回のサンプルコードではMeshフィールドの色を適当に変更するものになっています。これまでのサンプルではMeshのNullチェックを行っていましたが、今回はそれを省略しています。

そのためMeshフィールドをアタッチしていない場合は例外が発生しますが、try-catch文の中でその対処を行っているためアプリを安全に実行することができるようになっています。

catch文の中では例外が発生した時の処理を書きますが、基本的にログを残したり、開いているファイルを閉じたりと必要最低限の処理だけを行いましょう!

まとめ

今回の記事では例外処理について解説してきました。簡単にまとめますと以下の様になります。

  • 例外処理は想定外なことが起きた時に使用するC#の機能
  • 例外を投げたい時はthrowキーワードを使用する。
  • 発生した例外に対処するには例外が発生するであろう場所をtry catch文で囲む。
  • try文の中で発生した例外はその後のcatch文で処理できる。
  • catch文は発生する例外に応じて複数書くことができる。
  • catch文に指定した例外は型変換ができるならキャッチできる。
  • catch文で処理できなかった例外はメソッドを呼び出した側のメソッドで再度確認する。
  • もし例外が処理できなかったら、その時点でアプリの実行を終了する。
  • 全ての例外クラスはSystem.Exceptionを継承することを推奨している。
  • Unityでは例外が発生してもアプリ自体の動作は中断しない。代わりに発生したコンポーネントの処理がそこで中断される。

ここまででUnityC#講座入門編は終了です。お疲れ様でした。

まだ理解が不十分なところや難しかったところなどは適宜復習してみてください。

文法の基本を抑えたので次は実際にゲーム開発講座などをこなしていきましょう。

Unity ゲームの作り方 初心者向けUnity入門チュートリアル
このページでは、Unity初心者でも0から作れるゲーム開発講座を用意しています^^ 完全無料で当サイトで作ったオリジナルゲームをあなたも作れるようになるチュートリアル型のUnity入門講座です。

初心者向けUnityC#入門講座に戻る>>



Unity入門の森オリジナル本格ゲーム制作講座はこちら
5種類の本格ゲームの全ソースコード公開・画像&動画による解説付き


【Line登録者限定のプレゼントもあるよ!】

コメント

タイトルとURLをコピーしました