2017-06-14 50 views
0

我正在使用C#和Unity,并将可以在Unity和其他地方使用的库放在一起。这对我来说是有道理的,因为它对于网络和Id来说就像数据处理程序一样是相同的。团结和我在扩展把其他更多的是最新的C#环境之间的兼容性,我可以像下面这样:在Unity中处理异常

public static class PropertyInfoExtension 
{ 
    public void SetValue(this PropertyInfo propertyInfo, object obj, object value) 
    { 
     propertyInfo.SetValue(obj, value); 
    } 
} 

的错误,这不是明显对我来说,这是自称在统一的版本的C#。这段代码是在它自己的线程上运行的,这是我认为我做错了什么的地方,因为这应该导致缓冲区溢出异常。

我有一个注册AppDomain.CurrentDomain.UnhandledException ..我已经把一个日志系统,包装到UnityEngine.Debug.Log API。我输入try {} catch {} blocks,但Unity仍然会在一半的时间内崩溃并挂起另一半的时间..我会随机得到一条错误消息,并且第一次从UnhandledException处理程序获得转储时,它会将我放在轨道上以缩小这下来,但它感觉就像我在Unity中使用C#不正确,但我无法找出我应该做的。

编辑:我想在我的这个问题的修改之一,我明确删除它是什么..什么是正确的方式来获得统一错误?为什么这个错误会导致Unity崩溃而不是应用程序崩溃并抛出异常?为什么UnhandledExcpetion处理程序仅在2小时的测试中被调用一次?

这些都归结于我应该如何在Unity中可靠地开发一个强大的错误处理系统,因为显然我通常在C#中做的不够好。

+1

代码中没有多线程,您发布的代码没有描述您的问题,您的问题也没有清楚地描述问题。不知道你在这里做什么。 – CodingYoshi

+0

为什么你甚至在Unity里面使用Reflection? –

+0

@CodingYoshi对不起,我想在一个更清晰的问题更新,我从我的问题中删除了明确的问题。它现在在那里,但我只看在Unity中如何做可靠的错误处理..因为当应用程序有堆栈溢出而不是抛出异常的编辑器崩溃似乎我做错了什么。 – James

回答

2

在评论你的问题,你问这个:

我只是在看怎么办可靠的错误处理统一..因为编辑器崩溃,当应用程序有一个堆栈溢出,而不是抛出异常

不幸的是,你不能处理从.NET 2.0开始的StackOverflowException。这里是从MSDN

的报价在.NET Framework 1.0和1中。1,你可以捕获一个StackOverflowException对象(例如,从无限递归中恢复)。从.NET Framework 2.0开始,您无法使用try/catch块捕获StackOverflowException对象,并且相应的进程默认终止。因此,您应该编写代码来检测并防止堆栈溢出。

你所能做的只是修复你的代码。确定你是否使用递归,他们有一个终止条件。确保你的setters(属性)不会调用getters。这就是我可以提供的所有帮助。

+0

所以一般情况下,我有适当的东西,这个例外只是...例外?我觉得这有点有趣..谢谢! – James

0

在我看来,你有StackOverFlow,因为你在扩展方法内再次调用相同的方法。因此,与以下内容:

public static class PropertyInfoExtension 
{ 
    public void SetValue(this PropertyInfo propertyInfo, object obj, object value) 
    { 
     propertyInfo.SetValue(obj, value); 
    } 
} 

你基本上是这样做的:

public static class PropertyInfoExtension 
{ 
    public void SetValue(this PropertyInfo propertyInfo, object obj, object value) 
    { 
     propertyInfo.SetValue(obj, value) 
     { 
      // public void SetValue(this PropertyInfo propertyInfo, object obj, object value) 
      propertyInfo.SetValue(obj, value) 
      { 
       propertyInfo.SetValue(obj, value) 
       { 
        ... 
       } 
      } 
     } 
    } 
} 

想想看,调用相同的方法而不终止点递归方法。

public int InfiniteRecursiveCausesStackOverFlow(int a) 
{ 
    return InfiniteRecursiveCausesStackOverFlow(a); 
} 

每个方法调用记录在Stack,和无限的方法循环这样将使比它可以处理需要您Stack获取更多的内存,因此被称为StackOverFlow例外。

要解决此问题,您需要调用方法内的实际业务逻辑。

希望这会有所帮助。

+0

它的方法不一样。 –

+0

@DávidFlorek是的。这是一个[扩展方法](https://unity3d.com/learn/tutorials/topics/scripting/extension-methods),注意第一个参数有'this'关键字:这意味着这个对象是那个将扩展方法应用于它然后调用。 – Draco18s

+0

2m来不及编辑我的评论,所以我删除它添加了这一个..我没有真正的问题在我的问题..对不起。但是,我确实说过“这个错误对我来说并不明显,这是因为在我的原始问题中,这是在Unity版本的C#中调用它自己。我知道这是一个递归错误现在..我很烦恼它花了我在Unity 2个小时和随机运气中弄清楚了这一点。 – James