30

Unity3D のスクリプト作成を検討しており、グローバルな例外処理システムをセットアップしたいと考えています。これは、ゲームのリリース バージョンで実行するためのものではありません。意図は、ユーザー スクリプトとエディター スクリプトの例外をキャッチし、それらが分析のためにデータベースに転送されることを確認することです (また、関連する開発者に電子メールを送信して、シズルを修正します)。

通常の C# アプリでは、Main メソッドの周りに try-catch があります。WPF では、未処理の例外イベントを 1 つ以上フックします。ユニティで…?

これまでのところ、私が思いついた最高のものは次のようなものです:

using UnityEngine;
using System.Collections;

public abstract class BehaviourBase : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        try
        {
            performUpdate();
            print("hello");
        }
        catch (System.Exception e)
        {
            print(e.ToString());
        }

    }

    public abstract void performUpdate();

}

他のスクリプトでは、MonoBehavior の代わりに BehaviourBase を派生させ、Update() の代わりに performUpdate() を実装しています。Editor クラスの並列バージョンを実装していませんが、同じことを行う必要があると思います。

ただし、コミュニティから取得したスクリプトにバックポートする必要があるため、この戦略は好きではありません (そして、チームに強制する必要があります)。エディター スクリプトには、MonoBehavior に匹敵する単一のエントリ ポイントもありません。そのため、ウィザードやエディターなどの例外セーフ バージョンを実装する必要があると思います。

Application.RegisterLogCallbackを使用して (例外ではなく) ログ メッセージをキャッチすることについての提案を見てきました が、実際の例外やスタック トレースにアクセスするのではなく、デバッグ ログ文字列を解析する必要があるため、これは不快です。

それで...どうするのが正しいのですか?

4

5 に答える 5

2

Application.RegisterLogCallbackについて言及しましたが、実装してみましたか?ロギングコールバックはスタックトレース、エラー、およびエラータイプ(警告、エラーなど)を返す ためです。

上記で概説した戦略は、MonoBehavioursに単一のエントリポイントがあるだけではないため、実装するのが難しいでしょう。OnTriggerEvent、OnCollisionEvent、OnGUIなどを処理する必要があります。それぞれがそのロジックを例外ハンドラーでラップします。

私見、例外処理はここでは悪い考えです。例外をすぐに再スローしないと、これらのエラーが奇妙な方法で伝播することになります。たぶんFooはBarに依存し、BarはBazに依存しています。Say Bazは、キャッチされてログに記録される例外をスローします。次に、Bazから必要な値が正しくないため、Barは例外をスローします。最後に、Fooは、Barから取得した値が無効であるため、例外をスローします。

于 2013-02-25T15:13:23.643 に答える
0

Reporterと呼ばれるプラグインを使用して、未処理のエラーの瞬間にデバッグ ログ、スタック トレース、スクリーン キャプチャのメールを受け取ることができます。エラーの原因を突き止めるには、通常、スクリーン キャプチャとスタック トレースで十分です。頑固な卑劣なエラーの場合は、疑わしいデータをさらにログに記録し、ビルドしてエラーを再度待つ必要があります.これが役立つことを願っています.

于 2016-01-08T10:54:59.123 に答える