看板 GameDesign 關於我們 聯絡資訊
請教一下大家對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