我正在考虑做一些 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(使用前将#替换为@)