2024-10-12 002_學寫API_finally解釋

2024-10-12 002_學寫API_finally解釋

finally 代碼塊中的內容會在程序結束時執行,包括當你按下 Ctrl+C 終止應用程序的時候。

具體說明:

  1. try-catch-finally 結構:這種結構主要用來處理異常,並確保一些清理操作不論程序如何結束都能執行。它包含三個部分:

    • **try**:嘗試執行某些代碼。
    • **catch**:捕獲可能發生的異常並處理。
    • **finally**:無論 try 中是否發生異常,finally 中的代碼都會被執行。
  2. 在你的 Program.cs 中的代碼:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    try
    {
    // 應用程序的主邏輯,包括啟動服務
    var builder = WebApplication.CreateBuilder(args);
    // ...其他代碼
    app.Run();
    }
    catch (Exception ex)
    {
    logger.Error(ex, "Stopped program because of exception");
    throw;
    }
    finally
    {
    LogManager.Shutdown();
    }
    • 當你運行程序並按下 Ctrl+C 或是應用程序正常關閉時:
      • try 部分的代碼負責啟動應用程序及其所有服務。
      • 如果在 try 中發生了未處理的異常,會進入到 catch 區塊,記錄錯誤訊息。
      • 無論程序是否正常運行到結束,或者遇到異常退出,**finally** 區塊的代碼都會被執行。
      • 在這裡,LogManager.Shutdown() 確保在應用程序結束時,所有日志資源被妥善釋放並寫入到日志文件中。
  3. 按下 Ctrl+C 或其他退出程序的情況

    • 當你按下 Ctrl+C 在終端中手動停止應用程序,或者遇到一些致命錯誤導致程序崩潰,finally 區塊仍然會被執行,這是確保應用程序退出之前能夠進行一些必要的清理操作。
  4. finally 的重要性

    • 確保即使程序被異常終止,仍然能執行一些必須的操作,例如釋放文件資源、關閉數據庫連接、清理緩存等。
    • 在你的例子中,LogManager.Shutdown() 的目的是確保所有日志寫入文件並且清理相關資源,這樣就不會導致日志文件被損壞或未完全寫入。

所以當你按下 Ctrl+C,程序會進入 catch 區塊記錄錯誤,然後執行 finally 區塊進行清理,這是一個可靠的方式來確保程序中的重要資源得到釋放。