轉(zhuǎn)帖|行業(yè)資訊|編輯:龔雪|2016-06-02 15:35:35.000|閱讀 1569 次
概述:本文將為大家講解如何捕獲Unity手游崩潰異常。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
C#腳本未捕獲的異常,與Android和Native未捕獲異常很大的區(qū)別是,未捕獲異常不會(huì)照成引用的閃退。所以,C#腳本的異常危害相對較小,但是同樣更加容易存在在游戲中。閃退問題能夠及時(shí)發(fā)現(xiàn)并進(jìn)行修復(fù)。C#腳本異常,拋出的時(shí)機(jī)不同,危害性也有所不同; 在Start、Awake等函數(shù)拋出的異常,會(huì)造成Update、OnGUI無法正常運(yùn)行,游戲可能表現(xiàn)為無響應(yīng)、圖片確實(shí)等。Update、OnGUI的異常也一定會(huì)引起游戲邏輯及畫面上的一些異常。
從測試角度,C#腳本未捕獲的異常時(shí)一定需要報(bào)告給開發(fā)者的。
這幾乎是所有語言都會(huì)提供的一個(gè)機(jī)制,在發(fā)生未捕獲異常時(shí)回調(diào)。System.AppDomain在Unity的文檔中是不存在的,根據(jù)微軟官網(wǎng)的解釋,CurrentDomain獲取到當(dāng)前應(yīng)用程序當(dāng)前線程的應(yīng)用域。
If the UnhandledException event is handled in the default application domain, it is raised there for any unhandled exception in any thread, no matter what application domain the thread started in.
如果是在默認(rèn)域中注冊,任何線程中拋出的未捕獲異常均會(huì)觸發(fā)這個(gè)未處理異常函數(shù)。
然后,在游戲里面,嘗試在其他線程拋出異常。
但是,拋出異常后并沒有被這個(gè)處理函數(shù)接收到。
在UI線程中,Unity官方提供的函數(shù)基本上都會(huì)try..catch,所以很難有出現(xiàn)未捕獲的異常。比如,我們嘗試通過下面的代碼拋出未捕獲異常。
GameObject.SendMessage顯然是接住了這個(gè)異常,并打印出了這個(gè)異常信息。所以,UnhandledException大部分時(shí)候?qū)?huì)非常雞肋,并沒什么卵用。
根據(jù)日志的TAG都會(huì)Unity,可以大致判斷出UnityEngine自身的接口,在catch異常之后也是會(huì)調(diào)用Debug.LogError來輸出日志的。所以,我們可以通過注冊RegisterLogCallBack來獲取到系統(tǒng)的調(diào)用。
但是,在OnLogCallbackHandler,是不能夠調(diào)用Debug.Log,Debug.LogError這個(gè)API的,調(diào)用都會(huì)無效。Unity可能是為了避免引起,不必要的無限遞歸,所以在該函數(shù)下禁用Debug.Log。我們可以通過AndroidJavaClass調(diào)用Java代碼來輸出日志。
這樣就能順利的輸出,未捕獲的異常信息了。
Android在Thread中提供了setUncaughtExceptionHandler和
setDefaultUncaughtExceptionHandler,setUncaughtExceptionHandler函數(shù)只對應(yīng)注冊的線 程中起作用,setDefaultUncaughtExceptionHandler能夠在所有線程中都有用。所以,我 們要監(jiān)聽Jvm層拋出的未捕獲異常,可以直接注冊DefaultUncaughtExceptionHandler。
默認(rèn)的未捕獲處理函數(shù),在接到異常之后,最后會(huì)把進(jìn)程殺死。如果,不殺死會(huì)照成無響應(yīng)bug。
在代碼中增加上述,檢測程序后,即可輸出如下的日志結(jié)果。
原文轉(zhuǎn)載自:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn