[程式] 關於程式中發生的例外問題-Unity為例

看板GameDesign (遊戲設計)作者 (楊伯)時間11年前 (2014/02/20 16:19), 編輯推噓4(4011)
留言15則, 6人參與, 最新討論串1/1
請教一下大家對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

02/20 16:42, , 1F
try catch寫log
02/20 16:42, 1F

02/20 18:24, , 2F
同樓上
02/20 18:24, 2F

02/20 19:07, , 3F
會丟exception就是有人幫你檢查了,自己先檢查沒意義
02/20 19:07, 3F

02/20 19:08, , 4F
如果是可以處理的就把他catch起來 不行就丟給editor吧
02/20 19:08, 4F

02/21 22:44, , 5F
callstack不會告訴你是誰忘了把door assign值
02/21 22:44, 5F

02/21 22:45, , 6F
try catch和檢查如果沒做,只要一個人做錯資料
02/21 22:45, 6F

02/21 22:45, , 7F
全部人都停擺,你想選哪一種
02/21 22:45, 7F

02/22 20:10, , 8F
我覺得你要先了解 Exception 的意義
02/22 20:10, 8F

02/22 20:12, , 9F
如果 door 在你的正常處理流程上會有 null 的可能性
02/22 20:12, 9F

02/22 20:12, , 10F
那麼你就該使用 if 去判斷
02/22 20:12, 10F

02/22 20:13, , 11F
至於如果它是不正常的, 那麼就在可以處理的人那裡 catch
02/22 20:13, 11F

02/22 20:14, , 12F
這個 "可以處理的人" 在開發期間通常都是 Unity Editor
02/22 20:14, 12F

02/23 23:08, , 13F
感謝E大,我想知道的就是您最後一句話,讓Editor來當
02/23 23:08, 13F

02/23 23:09, , 14F
catch是不是正常的,按你的說法,這似乎是合理的現象
02/23 23:09, 14F

02/25 17:26, , 15F
要注意 "開發期間" 喔!
02/25 17:26, 15F
文章代碼(AID): #1J1RfzU_ (GameDesign)
文章代碼(AID): #1J1RfzU_ (GameDesign)