XAML in Xamarin.Forms 基礎篇 電子書

特別說明

2017/09/28

利用 UnhandledException 與 UnobservedTaskException 找出 Xamarin 的 "An unhandled exception occured" 錯誤問題

我們在進行 Xamarin.Forms 專案開發的時候,偶而會遇到這樣的例外錯誤訊息 An unhandled exception occured
unhandled exception1
可是,從這個畫面上,也看不出問題發生在哪裡,若我們點選 複製詳細資料 ,則會得到這樣的內容:An unhandled exception occured. 發生
結果,還是一樣,無法看到何有幫助的訊息。
在我們這裡,可以使用 C# 內建的類別 應用程式定義域 (Application Domain) 裡面的一個事件 UnhandledException;一旦你訂閱了這個事件,並且應用程式發生了沒有捕捉到的任何例外異常,這個訂閱的事件方法,將會被呼叫執行。
這個事件會接收一個客製化的事件引數類別 UnobservedTaskExceptionEventArgs 我們可以從這個參數中,得到真正發生例外異常的情況。
若想要使用這樣的功能,您需要在 Xamarin 原生專案的進入點加入訂閱這個事件,底下為在 Android 平台專案下的 MainActivity.cs的程式碼使用範例。
protected override void OnCreate(Bundle bundle)
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
    TabLayoutResource = Resource.Layout.tabs;
    ToolbarResource = Resource.Layout.toolbar;

    base.OnCreate(bundle);

    global::Xamarin.Forms.Forms.Init(this, bundle);
    LoadApplication(new App(new AndroidInitializer()));
}

private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    throw new NotImplementedException();
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    throw new NotImplementedException();
}
所以,你可以在 CurrentDomain_UnhandledException 設定一個中斷點,並且執行這個有問題的專案,若看到 An unhandled exception occured 這個錯誤訊息出現,則按下 F5 繼續來執行,直到在你剛剛設定的中斷點停下來;這個時候,你就可以查看 e 這個參數值,看到問題原因說明了,在這個範例中,我們看到的是 Master and Detail must be set before using a MasterDetailPage
unhandled exception1
unhandled exception1
此時,我們開啟 MasterDetailPage.xaml 檔案,您就會知道問題出在哪裡了。
<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
                  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                  xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
                  prism:ViewModelLocator.AutowireViewModel="True"
                  x:Class="PrismUnityApp4.Views.MDPage">

</MasterDetailPage>

2 則留言:

  1. 這篇超棒的! 感謝分享!

    回覆刪除
  2. 謝謝...解決了我很大的困擾....

    回覆刪除