我正在使用Azure表存储作为存储机制.我可以将视图模型中的异常从视图模型中写入Azure表,但当我try 向App.cs
上的未处理异常添加处理程序时,异常会记录在Debug Output窗口中,但不会存储在Azure表中.
这是我的Program.cs
分:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
fonts.AddFont("SF-Pro-Text-Bold.otf", "SFProTextBold");
fonts.AddFont("SF-Pro-Text-Regular.otf", "SFProTextRegular");
fonts.AddFont("materialdesignicons-webfont.ttf", "MaterialDesignIcons");
});
builder.UseMauiApp<App>()
.UseMauiCommunityToolkit()
.RegisterDataServices()
.RegisterViewModels()
.RegisterViews();
builder.Logging.AddSerilog();
var storageConnectionString = "MY_CONNECTION_STRING";
var tableName = "logs";
Log.Logger = new LoggerConfiguration()
.WriteTo.AzureTableStorage(connectionString: storageConnectionString, storageTableName: tableName)
.WriteTo.Debug()
.CreateLogger();
return builder.Build();
}
}
这是我的App.cs:
public partial class App : Application
{
private readonly ILogger<App>_logger;
public App(ILogger<App> logger)
{
_logger = logger;
InitializeComponent();
AppDomain.CurrentDomain.UnhandledException += HandleUnhandledException;
MainPage = new AppShell();
}
private void HandleUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
var exception = (Exception)e.ExceptionObject;
_logger.LogCritical(exception, exception.Message);
}
}
}
这是我要实现日志(log)记录的一个视图模型:
public class OnboardingViewModel : BaseViewModel
{
private ILogger<OnboardingViewModel> _logger;
public OnboardingViewModel(ILogger<OnboardingViewModel> logger)
{
_logger = logger;
}
private void OnSkipOnboardingCommand()
{
try
{
throw new Exception("Oops! Something went wrong.");
}
catch (Exception e)
{
_logger.LogError(e, e.Message);
}
}
}
当我try 这样做时,异常显示在输出窗口上,并保存到Azure表中:
但是,如果我将OnSkipOnboardCommand
更改为:
private void OnSkipOnboardingCommand()
{
throw new Exception("Oops! Unhandled Exception.");
}
我在App.cs
号的HandleUnhandledException
号收到了例外.异常仅记录到输出窗口中:
[0:] [07:38:43 FTL] Oops! Unhandled Exception.
System.Exception: Oops! Unhandled Exception.
at MyApp.Mobile.ViewModels.OnboardingViewModel.OnSkipOnboardingCommand() in C:\Users\Developer\Development\MyApp\src\MyApp.Mobile\ViewModels\OnboardingViewModel.cs:line 74
at Microsoft.Maui.Controls.Command.<>c__DisplayClass4_0.<.ctor>b__0(Object o) in D:\a\_work\1\s\src\Controls\src\Core\Command.cs:line 80
at Microsoft.Maui.Controls.Command.Execute(Object parameter) in D:\a\_work\1\s\src\Controls\src\Core\Command.cs:line 123
at Microsoft.Maui.Controls.TapGestureRecognizer.SendTapped(View sender, Func`2 getPosition) in D:\a\_work\1\s\src\Controls\src\Core\TapGestureRecognizer.cs:line 59
at Microsoft.Maui.Controls.Platform.TapGestureHandler.OnTap(Int32 count, MotionEvent e) in D:\a\_work\1\s\src\Controls\src\Core\Platform\Android\TapGestureHandler.cs:line 69
at Microsoft.Maui.Controls.Platform.InnerGestureListener.Android.Views.GestureDetector.IOnGestureListener.OnSingleTapUp(MotionEvent e) in D:\a\_work\1\s\src\Controls\src\Core\Platform\Android\InnerGestureListener.cs:line 157
at Android.Views.GestureDetector.IOnGestureListenerInvoker.n_OnSingleTapUp_Landroid_view_MotionEvent_(IntPtr jnienv, IntPtr native__this, IntPtr native_e) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-33/mcw/Android.Views.GestureDetector.cs:line 711
at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPL_Z(_JniMarshal_PPL_Z callback, IntPtr jnienv, IntPtr klazz, IntPtr p0) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:line 137
at Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualBooleanMethod(JniObjectReference instance, JniObjectReference type, JniMethodInfo method, JniArgumentValue* args) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/net7.0/JniEnvironment.g.cs:line 11969
at Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualBooleanMethod(String encodedMember, IJavaPeerable self, JniArgumentValue* parameters) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:line 164
at Android.Views.GestureDetector.OnTouchEvent(MotionEvent ev) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-33/mcw/Android.Views.GestureDetector.cs:line 1639
at Microsoft.Maui.Controls.Platform.TapAndPanGestureDetector.OnTouchEvent(MotionEvent ev) in D:\a\_work\1\s\src\Controls\src\Core\Platform\Android\TapAndPanGestureDetector.cs:line 36
at Microsoft.Maui.Controls.Platform.GesturePlatformManager.OnTouchEvent(MotionEvent e) in D:\a\_work\1\s\src\Controls\src\Core\Platform\GestureManager\GesturePlatformManager.Android.cs:line 83
at Microsoft.Maui.Controls.Platform.GesturePlatformManager.OnPlatformViewTouched(Object sender, TouchEventArgs e) in D:\a\_work\1\s\src\Controls\src\Core\Platform\GestureManager\GesturePlatformManager.Android.cs:line 204
at Android.Views.View.IOnTouchListenerImplementor.OnTouch(View v, MotionEvent e) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-33/mcw/Android.Views.View.cs:line 4196
at Android.Views.View.IOnTouchListenerInvoker.n_OnTouch_Landroid_view_View_Landroid_view_MotionEvent_(IntPtr jnienv, IntPtr native__this, IntPtr native_v, IntPtr native_e) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-33/mcw/Android.Views.View.cs:line 4137
at Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPLL_Z(_JniMarshal_PPLL_Z callback, IntPtr jnienv, IntPtr klazz, IntPtr p0, IntPtr p1) in /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:line 236
然而,这一例外在Azure存储上不会持续存在.这只发生在App.cs
上的HandleUnhandledException
方法的异常情况下.
异常被写入到输出窗口而不是Azure表的事实真的让我感到困惑.
你知道为什么会发生这种情况吗,或者我如何使用Serilog获取未处理的异常并将它们存储在Azure表中?我应该对我的代码进行一些更改吗?
我发现了什么