目标:

1、捕获全局异常信息。

2、向数据库中插入异常数据。

效果:

实现:

目标捕获全局异常信息。

1、在MainLayout.razor中添加<MErrorHandler OnHandle="Callback">,具体代码如下:

@using BlazorComponent.I18n
@using System.Globalization
@using XXXX.DB
@using XXXX.Models
@using Serilog
@inherits LayoutComponentBase
@inject I18n I18n
@inject ErrorLogsDatabase errorLogsDatabase
//2023-3-23-在这里加了个错误提示信息
@inject IPopupService PopupService

<MApp Id="inspire">
    <MErrorHandler OnHandle="Callback">
        <CascadingValue Value="@I18n.Culture.ToString()" Name="Culture">
       
            <MNavigationDrawer @bind-Value="_drawer" App>
                <!-- Your content -->
                <NavMenu/>
            </MNavigationDrawer>

            <MAppBar Color="deep-purple accent-4"
                     Dense
                     Dark App>
                <MAppBarNavIcon @onclick="() => _drawer = !_drawer">
                </MAppBarNavIcon>
                <MToolbarTitle>
                    @I18n.T("ApplicationName")
                </MToolbarTitle>
                <MSpacer></MSpacer>

                <MSwitch Class="mt-5 mr-10" @bind-Value="IsChinese" LeftText="EN" RightText="中" Color="black" TrackColor="#E5E6EB" MinHeight="30"></MSwitch>
            </MAppBar>

            <MMain>
                <CascadingValue Value="this" IsFixed>
                    @Body
                </CascadingValue>
            </MMain>
        </CascadingValue>
    </MErrorHandler>
</MApp>

@code {
    private CultureInfo? _culture;
    private bool _showMobileMenuList;
    private bool _hideAppBarNavIcon;
    private bool _showSettings;
    private string? _project;


    bool _drawer = true;
    bool _isChinee = true;

    public bool IsChinese
    {
        get { return _isChinee; }
        set
        {
            _isChinee = !_isChinee;
            SetLanugae();
        }
    }

    private void SetLanugae()
    {
        if (_isChinee)
        {
            I18n.SetCulture(new CultureInfo("zh-CN"));//将语言切换成zh-CN
        }
        else
        {
            I18n.SetCulture(new CultureInfo("en-US"));//将语言切换成zh-CN
        }
    }

    private async void Callback(Exception obj)
    {
        await errorLogsDatabase.SaveErrorLogsAsync(new ErrorLogs() { ErrorInformation = obj.Message });
        //2023-3-23-在这里加了个错误提示信息
        PopupService.EnqueueSnackbarAsync(obj.Message, AlertTypes.Error);
    }

}

2、在Index.razor页面中除个0,代码如下:

@page "/"
@using BlazorComponent.I18n
@inject I18n I18n

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

<MButton OnClick="OnClick">Throw exception</MButton>

@code{
    [CascadingParameter(Name = "Culture")]
    private string Culture { get; set; } = null!;

    private void OnClick()
    {
        int c = 0;
        int a = 10 / c;
    }
}

目标向数据库中插入异常数据

1、在NuGet中添加sqlite-net-pcl和SQLitePCLRaw.bundle_green,如下图:

 2、添加文件夹DB,创建类Constants和ErrorLogsDatabase,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace XXXX.DB
{
    public static class Constants
    {
        public const string DatabaseFilename = "HJ3201.db3";

        public const SQLite.SQLiteOpenFlags Flags =
            // open the database in read/write mode
            SQLite.SQLiteOpenFlags.ReadWrite |
            // create the database if it doesn't exist
            SQLite.SQLiteOpenFlags.Create |
            // enable multi-threaded database access
            SQLite.SQLiteOpenFlags.SharedCache;

        public static string DatabasePath =>
            Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename);
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XXXX.Models;
using SQLite;

namespace XXXX.DB
{
    public class ErrorLogsDatabase
    { 
        SQLiteAsyncConnection Database;
        public ErrorLogsDatabase() { }

        /// <summary>
        /// 初始化数据库
        /// </summary>
        /// <returns></returns>
        async Task Init()
        {
            if (Database is not null)
            {
                return;
            }

            Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
            var result = await Database.CreateTableAsync<ErrorLogs>();
        }
        /// <summary>
        /// 获取全部数据
        /// </summary>
        /// <returns></returns>
        public async Task<List<ErrorLogs>> GetItemsAsync()
        {
            await Init();
            return await Database.Table<ErrorLogs>().ToListAsync();
        }
        /// <summary>
        /// 获取未被删除的数据
        /// </summary>
        /// <returns></returns>
        public async Task<List<ErrorLogs>> GetItemsNotDelete()
        {
            await Init();
            return await Database.Table<ErrorLogs>().Where(t=>t.IsDelete==false).ToListAsync();
            // SQL queries are also possible
            //return await Database.QueryAsync<ErrorLogs>("SELECT * FROM [ErrorLogs] WHERE [IsDelete] = 0");
        }

        /// <summary>
        /// 根据id值获取日志
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<ErrorLogs> GetErroLogsAsync(int id)
        {
            await Init();
            return await Database.Table<ErrorLogs>().Where(t => t.ID == id).FirstOrDefaultAsync();
        }

        /// <summary>
        /// 保存错误日志信息,包含更新和插入
        /// </summary>
        /// <param name="errorLog"></param>
        /// <returns></returns>
        public async Task<int> SaveErrorLogsAsync(ErrorLogs errorLog)
        {
            await Init();
            if (errorLog.ID!=0)
            {
                return await Database.UpdateAsync(errorLog);
            }
            else
            {
                return await Database.InsertAsync(errorLog);
            }
        }

        /// <summary>
        /// 谨慎使用,直接删除数据。
        /// </summary>
        /// <param name="errorLog"></param>
        /// <returns></returns>
        public async Task<int> DeleteErrorLogsAsync(ErrorLogs errorLog)
        {
            await Init();
            return await Database.DeleteAsync(errorLog);
        }
    }
}

3、添加文件夹Models,添加类ErrorLogs,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SQLite;

namespace XXXX.Models
{
    
    public class ErrorLogs
    {
        /// <summary>
        /// 记录序号
        /// </summary>
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErrorInformation { get; set; }
        /// <summary>
        /// 是否删除
        /// </summary>
        public bool IsDelete { get; set; } = false;
        /// <summary>
        /// 插入时间
        /// </summary>
        public string InsertDateTime { get; set; }= DateTime.Now.ToString("F");
        /// <summary>
        /// 是否上传
        /// </summary>
        public bool IsUpLoad { get; set; } = false;

    }
}

4、在MauiProgram类中添加代码,代码如下:

        builder.Services.AddSingleton<ErrorLogs>();
        builder.Services.AddSingleton<ErrorLogsDatabase>();

更多推荐