作者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
→ Ansaga:try catch寫log 02/20 16:42
推 Kagami3421:同樓上 02/20 18:24
→ azureblaze:會丟exception就是有人幫你檢查了,自己先檢查沒意義 02/20 19:07
→ azureblaze:如果是可以處理的就把他catch起來 不行就丟給editor吧 02/20 19:08
推 killman:callstack不會告訴你是誰忘了把door assign值 02/21 22:44
→ killman:try catch和檢查如果沒做,只要一個人做錯資料 02/21 22:45
→ killman:全部人都停擺,你想選哪一種 02/21 22:45
推 Ebergies:我覺得你要先了解 Exception 的意義 02/22 20:10
→ Ebergies:如果 door 在你的正常處理流程上會有 null 的可能性 02/22 20:12
→ Ebergies:那麼你就該使用 if 去判斷 02/22 20:12
→ Ebergies:至於如果它是不正常的, 那麼就在可以處理的人那裡 catch 02/22 20:13
→ Ebergies:這個 "可以處理的人" 在開發期間通常都是 Unity Editor 02/22 20:14
→ yan04870449:感謝E大,我想知道的就是您最後一句話,讓Editor來當 02/23 23:08
→ yan04870449:catch是不是正常的,按你的說法,這似乎是合理的現象 02/23 23:09
推 Ebergies:要注意 "開發期間" 喔! 02/25 17:26