You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中调用LogCritical/LogError后终止控制台应用的方法

.NET Core控制台应用在记录LogError/LogCritical后终止程序的实现方案

当然可行,对于API密钥无效这类严重且无法恢复的错误,在记录日志后终止程序能有效避免无效请求重复执行,下面结合你的代码给出具体实现方式:

1. 直接强制终止进程(简单场景)

如果你的控制台应用没有使用Generic Host,直接用Environment.Exit()就能快速终止程序,非0的退出码可以标识异常终止状态。

你可以完善State.ExitAndLog方法的实现:

public static class State
{
    public static void ExitAndLog(StackTrace stackTrace, ILogger logger)
    {
        logger.LogCritical("程序因严重错误终止,堆栈信息:{StackTrace}", stackTrace.ToString());
        // 用非0码表示异常退出
        Environment.Exit(1);
    }
}

在你的错误分支中调用这个方法后,进程会立即终止,后续代码不会执行。

2. 优雅终止(基于Generic Host的场景)

如果你的控制台应用是用.NET Generic Host构建的(主流方式),推荐使用IHostApplicationLifetime来优雅终止,它会触发主机的停止流程,自动释放资源、注销服务。

步骤1:注入IHostApplicationLifetime

修改你的服务类构造函数,注入IHostApplicationLifetime:

private readonly ILogger<WebsiteApiServices> _logger;
private readonly IHostApplicationLifetime _appLifetime;

public WebsiteApiServices(ILogger<WebsiteApiServices> logger, IHostApplicationLifetime appLifetime)
{
    _logger = logger;
    _appLifetime = appLifetime;
}

步骤2:在错误处理中触发终止

修改你的GetResultsFromApi方法中的错误分支:

case "Invalid API Key":
    _logger.LogCritical($"API response: \"{failReason}\"");
    // 触发应用优雅停止
    _appLifetime.StopApplication();
    return null;

这种方式不会立即杀死进程,而是通知主机开始停止流程,完成资源清理后再退出,更适合复杂的控制台应用。

注意事项

  • 只在无法恢复的严重错误场景下使用程序终止逻辑,避免因小错误导致程序退出
  • 如果是异步方法中调用终止逻辑,Environment.Exit会直接终止进程,无需等待异步操作完成;而StopApplication需要确保主线程在等待主机停止(一般Generic Host的RunAsync会自动处理)

内容的提问来源于stack exchange,提问作者Fjalee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:27:06