作者yan04870449 (杨伯)
看板GameDesign
标题[程式] 关於程式中发生的例外问题-Unity为例
时间Thu Feb 20 16:19:06 2014
请教一下大家对Unity(C#)中的Exception都是怎麽的处理方法?
public class Car : MonoBehaviour
{
//车门的物件
public GameObject door = null;
void Start()
{
//从门物件中找到脚本,并关起门来
door.getComponent<Door>().Close();
}
}
以这段程式码为例,在Unity之下可能在两个地方发生
NullReferenceException,但是真的有必要在使用之前
去检查物件或脚本取出来是不是为null吗?
我之所以会这样问是因为,Editor会在run time出错的
时候告诉我哪边发生Exception,堆叠会告诉我一切,这
样我马上就知道哪边有问题,但是如果我写了检查变成
像下面这样
void Start()
{
if(door == null)
Debug.Error("door is null");
var _Com = door.getComponent<Door>();
if(_Com == null) reutrn ;
_Com.Close();
}
我做了两种例外的处理,第一种是抛Unity的Error,但这跟
Exception没甚麽差别,Exception还不见了,变成一个"讯息"
第二种是不处理,就直接return避免跳Exception或是造成游戏
异常的崩馈,但这样就好像只是骗自己这边没问题一样,但事实
上就是"车门没关"....
但是两种比较起来,好像都没有比较好,还是说一般例外根本
不能这样处理,是我观念一直错误?
到目前为止,比较能说服我自己的想法就是保持原样,因为我在开
发阶段靠Exception跟堆叠很快就可以让我找到问题,并且修改。
想跟大家讨论在这方面都是怎麽处理?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.166.249.166
1F:→ Ansaga:try catch写log 02/20 16:42
2F:推 Kagami3421:同楼上 02/20 18:24
3F:→ azureblaze:会丢exception就是有人帮你检查了,自己先检查没意义 02/20 19:07
4F:→ azureblaze:如果是可以处理的就把他catch起来 不行就丢给editor吧 02/20 19:08
5F:推 killman:callstack不会告诉你是谁忘了把door assign值 02/21 22:44
6F:→ killman:try catch和检查如果没做,只要一个人做错资料 02/21 22:45
7F:→ killman:全部人都停摆,你想选哪一种 02/21 22:45
8F:推 Ebergies:我觉得你要先了解 Exception 的意义 02/22 20:10
9F:→ Ebergies:如果 door 在你的正常处理流程上会有 null 的可能性 02/22 20:12
10F:→ Ebergies:那麽你就该使用 if 去判断 02/22 20:12
11F:→ Ebergies:至於如果它是不正常的, 那麽就在可以处理的人那里 catch 02/22 20:13
12F:→ Ebergies:这个 "可以处理的人" 在开发期间通常都是 Unity Editor 02/22 20:14
13F:→ yan04870449:感谢E大,我想知道的就是您最後一句话,让Editor来当 02/23 23:08
14F:→ yan04870449:catch是不是正常的,按你的说法,这似乎是合理的现象 02/23 23:09
15F:推 Ebergies:要注意 "开发期间" 喔! 02/25 17:26