我正在与C#和Unity一起工作,并建立一个库,我可以在Unity和其他地方使用它。这对我来说是有意义的,因为对于网络和Id来说,就像数据处理程序一样,基本上是一样的。为了使Unityand其他最新的C#环境具有兼容性,我将在可能的地方添加扩展,如下所示:
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,但联合公司只会一半时间崩溃,另一半时间吊死。我会随机地得到一条错误消息,当我第一次从UnhandledException处理程序获得转储时,它让我在轨道上缩小了这个范围,但是我感觉我在不恰当地使用C#,但是我找不出我应该做什么。
编辑:我想在我对这个问题的一次修改中,我明确地删除了它是什么。从统一中获得错误的正确方法是什么?为什么这个错误导致Unity崩溃而不是应用程序崩溃并抛出它的异常?为什么UnhandledExcpetion处理程序在2小时的测试中只被调用一次?
所有这些总结起来,我应该如何可靠地开发一个健壮的统一错误处理系统,因为很明显,我通常在C#中所做的工作还不够好。
发布于 2017-06-14 19:29:07
在对你的提问的评论中,你问:
我只是在看如何在联合中做可靠的错误处理。因为当应用程序有堆栈溢出而不是抛出异常时,编辑器会崩溃。
不幸的是,您无法从StackOverflowException 2.0开始处理.NET。这是MSDN的引文
在.NET Framework1.0和1.1中,您可以捕获一个StackOverflowException对象(例如,从无限递归中恢复)。从.NET Framework2.0开始,您无法捕获带有try/catch块的StackOverflowException对象,默认情况下相应的进程将终止。因此,您应该编写代码来检测和防止堆栈溢出。
你能做的就是修正你的代码。如果使用递归,请确保它们具有终止条件。确保您的setter(在属性中)没有调用getter。这就是我能提供的全部帮助。
发布于 2017-06-14 04:46:30
在我看来,您拥有的是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异常。
要解决这个问题,您需要在方法中调用实际的业务逻辑。
希望这能有所帮助。
https://stackoverflow.com/questions/44534323
复制相似问题