我們在進行 Xamarin.Forms 專案開發的時候,偶而會遇到這樣的例外錯誤訊息 An unhandled exception occured
可是,從這個畫面上,也看不出問題發生在哪裡,若我們點選 複製詳細資料
,則會得到這樣的內容: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
。
此時,我們開啟 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>