1. 程式人生 > >Unity手遊崩潰異常如何捕獲

Unity手遊崩潰異常如何捕獲

1、C#指令碼異常捕獲   C#指令碼未捕獲的異常,與Android和Native未捕獲異常很大的區別是,未捕獲異常不會照成引用的閃退。所以,C#指令碼的異常危害相對較小,但是同樣更加容易存在在遊戲中。閃退問題能夠及時發現並進行修復。C#指令碼異常,丟擲的時機不同,危害性也有所不同; 在Start、Awake等函式丟擲的異常,會造成Update、OnGUI無法正常執行,遊戲可能表現為無響應、圖片確實等。Update、OnGUI的異常也一定會引起遊戲邏輯及畫面上的一些異常。   從測試角度,C#指令碼未捕獲的異常時一定需要報告給開發者的。   1.1、AppDomain.CurrentDomain.UnhandledException回撥
  這幾乎是所有語言都會提供的一個機制,在發生未捕獲異常時回撥。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大部分時候將會非常雞肋,並沒什麼卵用。       1.2、Application.RegisterLogCallback日誌回撥   根據日誌的TAG都會Unity,可以大致判斷出UnityEngine自身的介面,在catch異常之後也是會呼叫Debug.LogError來輸出日誌的。所以,我們可以通過註冊RegisterLogCallBack來獲取到系統的呼叫。    
  但是,在OnLogCallbackHandler,是不能夠呼叫Debug.Log,Debug.LogError這個API的,呼叫都會無效。Unity可能是為了避免引起,不必要的無限遞迴,所以在該函式下禁用Debug.Log。我們可以通過AndroidJavaClass呼叫Java程式碼來輸出日誌。       這樣就能順利的輸出,未捕獲的異常資訊了。   本文收錄於《測試專刊-騰訊WeTest教你玩轉手遊測試》。