「c# 点滴 」 关于 C# 中错误处理的一些基本建议

前面我们介绍过 c# 中异常处理的最佳实践,重点在于从语言层面说明异常处理应该遵循的一些规范。错误处理是一个更广泛的概念,因为异常只是错误的一种,本文我们介绍一下错误处理的一些一般建议。

1. 事前的检查优于事后的处理

比如,任何时候都不能相信由用户提供的数据,必须提供数据校验机制,不符合规范的数据一律拒绝。现代编程框架基本都内置了丰富的数据校验机制,比如 Asp.Net Core 可以用 DataAnnotations 或者 FluentValidation进行数据校验。

 // 使用 DataAnnotations 定义数据验证规则
 public class Book
 {
     public int Id { get; set; }
 
     [Required]
     [StringLength(100)]
     public string Name { get; set; } = null!;
 
     [Required]
     [StringLength(1000)]
     public string Description { get; set; } = null!;
 }
 
 // 创建书籍时验证数据是否有效
 public async Task Create(Book book)
 {
     if (!ModelState.IsValid)
     {
         return View(book);
     }
     _context.Books.Add(book);
     await _context.SaveChangesAsync();
     return RedirectToAction(nameof(Index));
 }

2.在合适的位置处理异常

在合适的位置处理错误非常重要,这主要取决于以下几个因素。

1.该异常能否在代码中使用某种策略,比如重试、等待等得到处理,若能,应尽量在异常产生的源头处理。也就是说,使用 try catch finally 块就地处理异常。

2.若不能自动纠正,是否对程序逻辑和运行有重大影响(是否重大取决于程序的作用,需要开发者酌情认定),若无重大影响,允许不作处理,但至少应该记录异常或者以某种非侵入性的方式告知用户。

3.若不能自动纠正,且属于重大错误,则建议在某个地方集中处理异常。

 public partial class App : Application
 {
     public App()
     {
         DispatcherUnhandledException += App_DispatcherUnhandledException;
     }
 
     private void App_DispatcherUnhandledException(object sender,
         DispatcherUnhandledExceptionEventArgs e)
     {
         // 处理代码
     }
 }

3.遵循框架的最佳实践

集中处理重大异常是一个一般性的原则,每个框架都有自己的最佳实现方式。

UWP、WinUI 这样的桌面应用中,可以显示一个对话框,让用户选择一个可用的处理方式,或者更严重的,告知用户发生致命错误,告知用户查看日志的方法,并重启应用。

ASP.NET Core 中,应使用中间件和过滤器这样内置的机制。

 var app = builder.Build();
 
 if (!app.Environment.IsDevelopment())
 {
     app.UseExceptionHandler("/Error");
     app.UseHsts();
 }
 app.UseStatusCodePages();

Blazor 中,使用 ErrorBoundary 组件(.NET 6 中引入):

 
 
     
         @Body
     
     
         
     
 
 
 @code {
     private ErrorBoundary errorBoundary;
     protected override void OnParametersSet()
     {
         errorBoundary?.Recover();
     }
 }



发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章