公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

掌握 C# 語言中的異常處理

admin
2024年11月20日 1:19 本文熱度 1150


處理異常是在 C# 中編寫可靠且可維護的應用程序的關鍵部分。然而,如此多的開發(fā)人員仍然陷入陷阱,導致代碼難以調試和丟失重要的錯誤信息。在此博客中,我們將嘗試介紹 C# 中異常處理的最佳實踐,并介紹現(xiàn)代、可重用的技術,這些技術將使您的代碼更簡潔、更高效且更易于維護。

為什么異常處理很重要

C# 中的異常是當程序遇到意外情況(如無效輸入、網(wǎng)絡故障或資源限制)時發(fā)生的運行時錯誤。如果處理不當,異常可能會導致應用程序崩潰、降低用戶體驗并使調試成為一場噩夢。

正確的異常處理對于以下情況至關重要:

  • 穩(wěn)定性:防止意外崩潰并確保正常處理錯誤。

  • 調試:保留有用的信息(如堆棧跟蹤)以縮小任何問題的根本原因范圍。

  • 安全性:避免在錯誤消息中暴露敏感信息。

C# 語言中異常處理的最佳實踐

1. 只捕捉你能處理的

開發(fā)人員常犯的一個錯誤是捕獲異常而沒有正確處理它們。如果不知道如何以有意義的方式處理方法中的異常,最好讓它冒泡到更高的級別。僅在您可以處理的地方捕獲異常。

try  
{  
   // Code that might throw an exception  
}  
catch (SpecificException ex)  
{  
   // Handle specific exception, like logging or retrying  
}

**避免:**捕獲一般異常,除非它位于調用堆棧的頂部,例如在全局錯誤處理代碼中。不加選擇地捕獲所有內(nèi)容會使診斷特定問題變得更加困難。

2. 正確重新拋出異常:避免throw ex;

異常處理中的另一個常見錯誤是在塊內(nèi)使用。許多開發(fā)人員不知道這會重置堆棧跟蹤,從而更難跟蹤最初引發(fā)異常的位置。Always use 用于保留原始堆棧跟蹤。throw ex;catchthrow;

不對:

catch (Exception ex)  
{  
   // This resets the stack trace  
   throw ex;  
}

正確:

catch (Exception ex)  
{  
   // Preserves the original stack trace  
   throw;  
}

通過保留堆棧跟蹤,您可以保留有關錯誤來源的最關鍵信息,從而更輕松地調試和修復問題。

3. 對特定于域的錯誤使用自定義例外

如果內(nèi)置異常(如 or 等)不能準確描述應用程序中的錯誤,請考慮創(chuàng)建自定義異常。這增加了清晰度,并使您的代碼更具可讀性。ArgumentNullExceptionInvalidOperationException

public class InvalidOrderException : Exception  
{  
   public InvalidOrderException(string message) : base(message) { }  
}

僅當自定義例外對理解特定域中的問題有真正的價值時,才使用自定義例外。

4. 記錄異常,但避免超日志

記錄異常是必不可少的,但過度記錄可能會使您的日志不堪重負,其中包含不必要的數(shù)據(jù)。僅當異常提供有價值的見解時才記錄異常,并確保不暴露敏感信息。

catch (Exception ex)  
{  
   // Log the exception with meaningful details  
   logger.LogError(ex, "Error occurred during operation.");  
   throw;  // Rethrow the exception to maintain the stack trace  
}

避免:記錄每個小異常或記錄過多細節(jié),這可能會淹沒您的日志并掩蓋真正的問題。過度日志記錄也會損害應用程序性能。

5. 使用 ASP.NET Core 中的過濾器進行集中式異常處理

如果您正在構建 ASP.NET Core 應用程序,則可以使用異常篩選條件集中處理異常。這是一種在一個位置處理整個應用程序中錯誤的現(xiàn)代方法。

示例:全局異常過濾器

public class GlobalExceptionFilter : IExceptionFilter  
{  
   public void OnException(ExceptionContext context)  
   {  
       var exception = context.Exception;  
       // Handle and log the exception globally  
       context.Result = new ObjectResult("An internal error occurred")  
       {  
           StatusCode = 500  
       };  
       context.ExceptionHandled = true;  
   }  
}

在 中全局注冊此過濾器 :Startup.cs

public void ConfigureServices(IServiceCollection services)  
{  
   services.AddControllers(options =>  
   {  
       options.Filters.Add<GlobalExceptionFilter>();  
   });  
}

這可確保在整個應用程序中一致地處理所有異常,從而提高應用程序的整體可維護性。

現(xiàn)代異常處理技術

1. 使用函數(shù)式編程實現(xiàn)更清晰的異常處理

函數(shù)式編程原則可以幫助您編寫更簡潔、更具可讀性的代碼。您可以使用高階函數(shù)封裝異常處理,從而減少樣板代碼并使邏輯更具聲明性。

使用這種方法可能是個人選擇,因為許多開發(fā)人員可能不習慣使用它。

public static class Try  
{  
   public static void Execute(Action action, Action<Exception> handleError)  
   {  
       try  
       {  
           action();  
       }  
       catch (Exception ex)  
       {  
           handleError(ex);  
       }  
   }  
}

用法:

Try.Execute(() =>   
{  
   // Risky operation  
   int result = 10 / 0;  
}, ex => Console.WriteLine($"Error: {ex.Message}"));

這使您的代碼保持簡潔,并專注于業(yè)務邏輯。

2. 正常處理異步異常

在處理異步代碼時,異常處理可能會變得更加棘手。使用或創(chuàng)建異步包裝器來有效地管理異步異常。Task.Run

public static async Task SafeExecuteAsync(Func<Task> action, Action<Exception> handleError)  
{  
   try  
   {  
       await action();  
   }  
   catch (Exception ex)  
   {  
       handleError(ex);  
   }  
}

用法:

await SafeExecuteAsync(async () =>  
{  
   await SomeAsyncOperation();  
}, ex => Console.WriteLine($"Async error: {ex.Message}"));

此方法可確保異步代碼中的異常得到與同步代碼中一樣的正常處理。

3. 使用包裝器進行顯式錯誤處理Result

對于更可預測的錯誤流,請使用包裝器顯式處理成功或失敗,從而在操作失敗時明確說明,而無需僅依賴異常。Result

這是我個人喜歡的方法。

public class Result<T>  
{  
   public T Value { get; }  
   public Exception Error { get; }  
   public bool IsSuccess => Error == null;  
 
   private Result(T value, Exception error)  
   {  
       Value = value;  
       Error = error;  
   }  
 
   public static Result<T> Success(T value) => new Result<T>(value, null);  
   public static Result<T> Failure(Exception error) => new Result<T>(default, error);  
}

用法:

var result = Divide(10, 0);  
if (result.IsSuccess)  
{  
   Console.WriteLine($"Result: {result.Value}");  
}  
else  
{  
   Console.WriteLine($"Error: {result.Error.Message}");  
}

此模式提供了一種結構化的方式來管理錯誤,而不完全依賴于異常。

編寫健壯的現(xiàn)代 C# 代碼

掌握異常處理不僅僅是避免應用程序崩潰。它更多的是關于編寫可維護、清晰且有彈性的代碼,以優(yōu)雅地處理意外情況。通過應用這些最佳實踐和現(xiàn)代技術(例如利用函數(shù)式編程原則、正確處理異步錯誤以及將異常處理集中在 ASP.NET Core 中),您不僅可以顯著提高代碼質量,還可以顯著提高應用程序的整體穩(wěn)定性。

請記住,適當?shù)漠惓L幚聿粌H可以幫助您更快地進行調試,還可以確保更好的用戶體驗。


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

主站蜘蛛池模板: 国产野战正规军全 | 国产成人精品无码一区二区蜜柚 | 18禁美女黄网站色大片免费看 | 国产精品视频一二三四五 | 国产熟女高潮精选 | 国产日韩亚洲大尺度高清 | 国产人妻精品区一区二区三区 | 91免费看污`羞羞的软件 | 国产成人精品亚洲日本专区61 | 国产成人毛片一区二区 | 国产成人精品一区二区免费视频 | 国产一区二区三区不卡在线看 | 国产偷人妻精 | av在线播放黄片 | 91午夜福利国产在 | 国产精品午夜福利在线观看网站 | 国产黄页视频在线观看 | 国产福利无码 | 国产午夜亚洲精品不 | 国产主播一区二区三区在 | 国产精品久久久久久久久久日本 | 国产三香港三韩国三级不卡 | 国产av一区二区三区久久 | aⅴ中文无码亚洲 | 精品一区二区三区免费毛片爱 | 成人综合色在线 | 国产亚洲欧洲乱码在线 | 国产无套高潮在线观看 | 成人精品久久一区 | 2025国产理论 | 国产精品无码色一区二涩欲区三区 | 91麻豆成人精品国产免费软件 | 91麻豆国产精品91久久久 | 精品毛片免费观看 | 国产精品无码a∨麻豆 | 丰满少妇熟乱xx | 国产喷水aⅴ | 国产精品重口变态sm在线观看 | 高潮毛片无遮挡免费高清69 | 白丝爆浆18禁一区二区三区 | 国产综合第一页在线视频 |