トーフメモ

主にゲーム制作

【UnityC#】例外クラスを自作する

C#には例外処理があらかじめ色々定義されています。なんとかExceptionとか、ほにゃららExceptionとか。
特定のシチュエーションでの例外を自分で定義したい!となった時のために例外クラスの自作について調べました。
以下のコードではボールオブジェクトの重力を切る処理をRigidBodyを参照して行います。

RigidBodyの参照がされない主なパターンとして、
(1)用意したRigidbodyの参照がnull
(2)そもそもRigidbodyがアタッチされていない
があるので、その時に例外処理をします。
この2つのパターンを新たな例外としてクラスを作成します。

Ball.cs

using UnityEngine;

public class Ball : MonoBehaviour {
    [SerializeField]
    private Rigidbody _rigidbody;

    private void Start () {
        InactivateGravity();
    }

    /// <summary>
    /// 重力を切る
    /// </summary>
    private void InactivateGravity () {
        try {
            if(!GetComponent<Rigidbody>()) {
                throw new UnattachedComponentException("RigidBodyがアタッチされていません。");
            }

            if(!_rigidbody) {
                throw new UnreferencedComponentException("_righdbodyが参照できませんでした。");
            }
        } catch(UnattachedComponentException e) {
            Debug.LogError(e);

            _rigidbody = gameObject.AddComponent<Rigidbody>();
            Debug.Log(_rigidbody + " をアタッチしました");
        } catch(UnreferencedComponentException e) {
            Debug.LogError(e);

            _rigidbody = GetComponent<Rigidbody>();
            Debug.Log(_rigidbody + " を参照しました");
        } finally {
            _rigidbody.useGravity = false;
        }
    }
}

UnattachedComponentException

using System;

public class UnattachedComponentException : Exception {
    public UnattachedComponentException () : base() {

    }

    public UnattachedComponentException (string message) : base(message) {

    }
}

UnreferencedComponentException

using System;

public class UnreferencedComponentException : Exception {
    public UnreferencedComponentException () : base() {

    }

    public UnreferencedComponentException (string message) : base(message) {

    }
}

おわりに

必要に応じて拡張するといい感じに使えそうです。