強火で進め

このブログではプログラム関連の記事を中心に書いてます。

例外発生時にコールバック関数が呼ばれる様にする方法

Application.RegisterLogCallback を使うと例外発生時にコールバック関数が呼ばれるように設定可能です。

C# のサンプルはこの様になります。空の GameObject を作成し、貼り付けた後に実行してみて下さい。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {
	string _condition = "";
	string _stackTrace = "";
	string _type = "";
	string num = "";
	string res = "";
	
	void OnEnable ()
	{
		Application.RegisterLogCallback (HandleLog);
	}
	
	void OnDisable ()
	{
		Application.RegisterLogCallback (null);
	}
	
	void HandleLog (string condition, string stackTrace, LogType type)
	{
		_condition = condition;
		_stackTrace = stackTrace;
		_type = type.ToString();
	}
	
	void OnGUI ()
	{
		num = GUI.TextField (new Rect (10, 10, 100, 50), num);
		GUI.Label (new Rect (120, 10, 100, 50), res);
		if (GUI.Button (new Rect (10, 70, 150, 50), "test")) {
			res = (10 / int.Parse(num)).ToString();
		}
		GUI.TextArea (new Rect (10, 130, 300, 200), 
			"condition : " + _condition + "\nstackTrace : " + _stackTrace + "\ntype : " + _type);
	}
}

このサンプルでは TextField に未入力で「Test」ボタンを押すと int.Parse() のタイミングで以下の様に例外が発生し、コールバックが行われた事を確認出来ます。

TextField に 0 を指定すると DivideByZeroException が発生し、以下の様な結果と成ります。

もちろん名前の通り、ログの出力時にもコールバックが呼ばれます。例えば Debug.Log("hoge") を実行したタイミングで以下の様なコールバックが発生します。

実行ファイル上で Debug.Log() の値が取得したい時などに便利です。

関連情報

Unity Script Reference – Application.RegisterLogCallback
http://docs.unity3d.com/Documentation/ScriptReference/Application.RegisterLogCallback.html