前面我们介绍过 c# 中异常处理的最佳实践,重点在于从语言层面说明异常处理应该遵循的一些规范。错误处理是一个更广泛的概念,因为异常只是错误的一种,本文我们介绍一下错误处理的一些一般建议。
比如,任何时候都不能相信由用户提供的数据,必须提供数据校验机制,不符合规范的数据一律拒绝。现代编程框架基本都内置了丰富的数据校验机制,比如 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));
}
在合适的位置处理错误非常重要,这主要取决于以下几个因素。
1.该异常能否在代码中使用某种策略,比如重试、等待等得到处理,若能,应尽量在异常产生的源头处理。也就是说,使用 try catch finally 块就地处理异常。
2.若不能自动纠正,是否对程序逻辑和运行有重大影响(是否重大取决于程序的作用,需要开发者酌情认定),若无重大影响,允许不作处理,但至少应该记录异常或者以某种非侵入性的方式告知用户。
3.若不能自动纠正,且属于重大错误,则建议在某个地方集中处理异常。
public partial class App : Application
{
public App()
{
DispatcherUnhandledException += App_DispatcherUnhandledException;
}
private void App_DispatcherUnhandledException(object sender,
DispatcherUnhandledExceptionEventArgs e)
{
// 处理代码
}
}
集中处理重大异常是一个一般性的原则,每个框架都有自己的最佳实现方式。
在 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 条评论) “” |