.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
相关产品推荐
相关产品推荐

