Unity3D 的良好全局异常处理策略是什么?

2024-03-09

我正在考虑做一些 Unity3D 脚本编写的东西,并且我想建立全局异常处理系统。这不适用于在游戏的发布版本中运行,其目的是捕获用户脚本和编辑器脚本中的异常,并确保将它们转发到数据库进行分析(并向相关开发人员发送电子邮件,以便他们可以修复他们的杂音)。

在普通的 C# 应用程序中,我在 Main 方法周围有一个 try-catch。在 WPF 中,我会挂接一个或多个未处理的异常事件 https://stackoverflow.com/questions/1472498/wpf-global-exception-handler。在团结...?

到目前为止,我能想到的最好的办法是这样的:

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();

}

在其他脚本中,我派生BehaviourBase而不是MonoBehavior,并实现performUpdate()而不是Update()。我还没有为编辑器类实现并行版本,但我想我必须在那里做同样的事情。

然而,我不喜欢这种策略,因为我必须将其向后移植到我们从社区获取的任何脚本(并且我必须在团队中强制执行它)。编辑器脚本也没有与 MonoBehavior 相比的单一入口点,因此我认为我必须实现向导、编辑器等的异常安全版本。

我已经看到关于使用捕获日志消息(而不是异常)的建议应用程序.RegisterLogCallback http://docs.unity3d.com/Documentation/ScriptReference/Application.RegisterLogCallback.html,但这让我感到不舒服,因为我需要解析调试日志字符串,而不是访问实际的异常和堆栈跟踪。

那么...正确的做法是什么?


在场景中创建一个空的游戏对象并将此脚本附加到它:

using UnityEngine;
public class ExceptionManager : MonoBehaviour
{
    void Awake()
    {
        Application.logMessageReceived += HandleException;
        DontDestroyOnLoad(gameObject);
    }

    void HandleException(string logString, string stackTrace, LogType type)
    {
        if (type == LogType.Exception)
        {
             //handle here
        }
    }
}

确保有一个实例.

剩下的就取决于你了。您还可以将日志存储在文件系统, 网络服务器 or 云储存.


注意DontDestroyOnLoad(gameObject)通过防止场景更改时被破坏,使该游戏对象持久化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3D 的良好全局异常处理策略是什么? 的相关文章

随机推荐