在Unity中捕获所有异常

6
我在应用商店中有一个Unity移动游戏,并且我有一个功能,可以将玩家发送的电子邮件发送到我的服务器,以通知我发生了不应该发生的事情。例如,如果我编写的try失败了,我会发送一封电子邮件给自己,以查看是否存在错误。

是否可能构建类似于OnException处理程序的东西,以便在发生每个异常时都向我发送电子邮件,包括我未编写的代码?某些异常可能来自我使用的插件,因此我希望有某种监听器,可以在任何类型的异常被调用时执行操作。

这可能吗?


1
我认为这可能是可行的。你已经尝试过什么了? - PJvG
4个回答

18

在其他插件中,您无法捕获所有其他异常。Unity会在后台完成这项工作,并为您提供API以接收其捕获的异常:

较新版本的Unity

void OnEnable()
{
    Application.logMessageReceived += LogCallback;
}

//Called when there is an exception
void LogCallback(string condition, string stackTrace, LogType type)
{
    //Send Email
}

void OnDisable()
{
    Application.logMessageReceived -= LogCallback;
}

Unity的旧版本:

void OnEnable()
 {
     Application.RegisterLogCallback(LogCallback);
 }

 //Called when there is an exception
 void LogCallback(string condition, string stackTrace, LogType type)
 {
     //Send Email
 }

 void OnDisable()
 {
     Application.RegisterLogCallback(null);
 }

还有logMessageReceivedThreaded

编辑

堆栈跟踪问题

如果stackTrace参数为空,则可以在LogCallback函数内部使用System.Diagnostics.StackTrace类手动检索堆栈跟踪。例如,

void LogCallback(string condition, string stackTrace, LogType type)
{
    //Send Email

    System.Diagnostics.StackTrace sTrace = new System.Diagnostics.StackTrace();
    Debug.Log(sTrace.ToString());
}

这很简单,如果它能正常工作的话。我会尽快测试它。 - Tavados
当我将来转向Unity Pro时,这基本上变得多余了,因为Unity Performance Reporting会为我完成这项工作,不是吗? - Tavados
3
如果您拥有 Unity Performance Reporting,则不需要这个。请注意,即使可以使用 Unity Performance Reporting,某些公司也会使用自己的服务器来报告代码中的错误。当您使用 Unity Performance Reporting 时,您依赖于 Unity 的服务器。如果他们的服务器出问题了,您就会遇到麻烦。我曾经看到过他们的服务器崩溃一次,就像亚马逊服务器也曾经崩溃一样。您应该始终使您的应用程序/游戏不依赖于其他公司的服务器。 - Programmer
那么我理解得对:我必须要将这几行代码添加到每个 MonoBehaviour 上,是吗? - cagcoach
1
@cagcoach 不,那个脚本只会在一个游戏对象上(可能被称为“logCatcher”或其他名称)运行,然后该游戏对象/脚本将对异常进行处理(可能向用户显示某些内容,可能仅将其记录在文件中,也可能将其发送给开发人员)。你所做的就是注册你想要在有新的日志消息时调用的自定义函数。 - Clonkex

0

我试图回答一个被标记为重复的问题 (如何在Unity C#中运行时检测是否有错误而不看控制台?),但是它已经关闭了,所以我在这里添加一个答案。

我想直接将消息打印到屏幕上,因为在我的情况下使用调试日志是行不通的。这是我找到的优雅解决方案(使用Android的默认ShowDialog):

using (AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.cattlecall.unityandroidaccessor.UnityAndroidDialog"))
{
    androidJavaClass.CallStatic("ShowDialog", new object[]
    {
        "PORT",
        port.ToString(),
        "yis'm",
        "NOOOOO"
    });
}

0

不,那里提供的解决方案已经过时了。请参阅被接受的答案。 - david.pfx

0

看看Hockey App。非常好用的工具,有Unity SDK,正好能满足你所需。每个Debug.LogError或Debug.LogException都将在那里被报告。因此,你不仅可以收到代码异常的通知,还可以收到一些数据丢失或任何你想报告为错误的通知。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接