LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

【C#】致命陷阱!濫用 try-catch 正在摧毀你的 .NET 應用

admin
2025年7月24日 10:33 本文熱度 565

核心警示:

你添加 try-catch 本想保護應用,
結果卻:隱藏錯誤觸發重試風暴、讓故障追蹤難如登天。

在 .NET 中,try-catch 并非總是盟友——有時它正是系統無聲崩潰的元兇。


正確處理異常的關鍵:讓應用高聲報錯、優雅恢復、永不讓你猜謎!

?? 典型災難代碼

try
{
    var user = await _userService.GetUserAsync(id);
    _logger.LogInformation("Fetched user");
}
catch (Exception ex)  // 全類型捕獲
{
    _logger.LogError(ex, "Something went wrong"); 
}

看似安全
靜默掩蓋根因
?? 違反關注點分離
?? 引發重試循環、丟失指標、調試地獄


? 五大 try-catch 反模式(附解決方案)

? 修復方案 1:使用 when 過濾器

try
{
    // 業務邏輯
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
    _logger.LogWarning("用戶不存在");  // 精準捕獲
}

優勢
?? 避免無關異常誤入
?? 保持處理邏輯精準可控

?? 重要提示:僅捕獲可處理的異常。未知庫故障等極少數場景下,可用寬泛捕獲記錄日志后重新拋出(throw;

? 修復方案 2:預防代替捕獲

if (!File.Exists(path))  // 防御性檢查
{
    _logger.LogWarning("文件缺失: {path}", path);
    return;
}
// 而非盲目捕獲 FileNotFoundException

原則
?? 防御性編程 > 異常控制流
?? 根據場景合理選用,非萬能方案

? 修復方案 3:創建領域專屬異常

public classPaymentDeclinedException : Exception// 自定義異常
{
    public PaymentDeclinedException(string reason) : base(reason) { }
}

// 精準捕獲可處理的異常
try
{
    await _paymentService.ProcessAsync();
}
catch (PaymentDeclinedException ex)  // 僅捕獲支付拒絕
{
    _logger.LogWarning("支付拒絕: {reason}", ex.Message);
    return BadRequest(ex.Message);
}

價值
?? 提升代碼可讀性
?? 增強可測試性
?? 明確恢復路徑

? 修復方案 4:中間件統一處理

// 注冊異常處理中間件
app.UseExceptionHandler("/error"); 

// 集中處理錯誤響應
app.Map("/error", (HttpContext context) =>
{
    var feature = context.Features.Get<IExceptionHandlerFeature>();
    return Results.Problem(detail: feature?.Error.Message);
});

優勢
?? 全局統一錯誤響應
?? 業務代碼零污染

? 修復方案 5:后臺任務禁止吞沒異常

try
{
    await _processor.RunAsync();
}
catch (Exception ex)
{
    _logger.LogCritical(ex, "任務失敗");
    throw;  // 重新拋出!讓編排器(如Azure Functions)可見故障
}

關鍵原則
?? 后臺任務靜默失敗 = 定時炸彈
?? 必須拋出以便觸發重試/告警

? 修復方案 6:分層彈性策略(Polly)

services.AddHttpClient("Users")
        .AddTransientHttpErrorPolicy(p =>
            p.WaitAndRetryAsync(3, retry => TimeSpan.FromSeconds(Math.Pow(2, retry))));  // 指數退避重試

核心價值
?? HTTP層處理瞬時故障
?? 業務代碼無侵入


?? 專家級技巧:生產就緒清單

? 必做項
? 禁止項
用 when 替代寬泛捕獲
吞沒不可恢復的異常
自定義領域異常
在 catch 塊內盲目重試
中間件集中處理
使用 async void 方法
后臺任務必須重新拋出
未處理的任務異常
用 Polly 實現彈性策略
依賴異??刂屏鞒?/span>


?? 終極忠告

try-catch 不是安全網,而是精密手術刀
我親歷的 .NET 生產事故中,從未因未捕獲異常引發宕機
真正的災難總是:
?? 異常被捕獲 → 記錄日志 → 靜默忽略 → 用戶發現故障時已無力回天
沒有告警,沒有重試,只有沉默的崩潰。

讓錯誤暴露在陽光下,才是真正的韌性。


該文章在 2025/7/24 14:53:37 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
在线看片不卡人成视频 | 色综合久久久久网 | 日韩中文字幕在线综合网 | 限制级福利影院在线观看 | 亚洲日韩一区二区 | 韩国资源一区在线 |