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